From 53167cd31d9fbc0ec5ff8f7709551dae3d3418a1 Mon Sep 17 00:00:00 2001 From: nils <48135649+Nilstrieb@users.noreply.github.com> Date: Fri, 17 Mar 2023 15:39:55 +0100 Subject: [PATCH] Update item-patterns-and-struct-else.md --- .../posts/item-patterns-and-struct-else.md | 62 ++++++++++++++++++- 1 file changed, 61 insertions(+), 1 deletion(-) diff --git a/content/posts/item-patterns-and-struct-else.md b/content/posts/item-patterns-and-struct-else.md index 1d03ecc..485e078 100644 --- a/content/posts/item-patterns-and-struct-else.md +++ b/content/posts/item-patterns-and-struct-else.md @@ -91,11 +91,71 @@ But there is one big limitation of pattern matching - all of its occurrences (`m This doesn't sound too bad. This is where the executed code resides. But it comes at a cost of consistency. We often add many syntactical niceties to expressions and statements, but forget about items. +# Items and sadness + Items have a hard life. They are the parents of everything important. `struct`, `enum`, `const`, `mod`, `fn`, `union`, `global_asm` are all things we use daily, yet their grammar is very limited. -For example, see the following code +For example, see the following code where we declare a few constants. ``` +const ONE: u8 = 1; +const TWO: u8 = 1; +const THREE: u8 = 3; +``` + +There is nothing obviously wrong with this code. You understand it, I understand it, an ALGOL 68 developer from 1970 would probably understand it +and even an ancient greek philopher might have a clue (which is impressive, given that they are all not alive anymore). But this is the kind of code that pages you at 4 AM. + +You've read the last paragraph in confusion. Of course there's something wrong with this code! `TWO` is `1`, yet the name strongly suggests that it should be `2`. And you'd +be right, this was just a check to make sure you're still here. + +But even if it was `2`, this code is still not good. There is way too much duplication! `const` is mentioned three times. This is a major distraction to the reader. + +Let's have a harder example: + +```rust +const ONE: u8 = 0; const +NAME: & +str = "nils"; + const X: &str + = "const";const A: () = (); +``` + +Here, the `const` being noise is a lot more obvious. Did you see that `X` contains `"const"`? Maybe you did, maybe you didn't. When I tested it, 0/0 people could see it. + +Now imagine if it looked like this: + +```rust +const (ONE, NAME, X, A): (u8, &str, &str, ()) = (0, "nils", "const", ()); +``` + +Everything is way shorter and more readable. + +What you've just seen is a limited form of pattern matching! + +# Let's go further + +The idea of generalizing pattern matching is very powerful. We can apply this to more than just consts. + +```rust +struct (Person, Car) = ({ name: String }, { wheels: u8 }); +``` + +Here, we create two structs with just a single `struct` keyword. This makes it way simpler and easier to read when related structs are declared. +So far we've just used tuples. But we can go even further. Metastructs! + +``` +struct Household { + parent: struct, + child: struct, +} + +struct Colors { parent: , child: Green } = Colors { + red: { +}; + maybe this post was meant as a joke. maybe it wasn't. it is up to you to bring your own judgement to the idea and write an RFC. +
+this post was not meant to make fun of anyone's ideas. it was just a good bad idea i had once and then friends made me write this