Let's write a macro in Rust

57 pointsposted 7 days ago
by hackeryarn

20 Comments

tialaramex

2 hours ago

So, this article is writing a "by example" macro, and my impression is that many comments here are thinking about Rust's procedural or "proc" macros and most particularly its entirely general procedural macros which are indeed arbitrary code executing in the compiler. That's not what the article is about at all.

"by example" macros are actually just a fancier version of templating systems I'd expect most of you have used. Their biggest fancy feature is probably repetition, it's easy for Rust's macro to say if we've got a list of N things, we're going to emit this same code N times, but with each thing in turn filled out.

The syntax doesn't look that much like the rest of Rust but that's mostly an ergonomic consideration, so you can distinguish between your macro and the code your macro is spitting out. In fact "at least the syntax is the same" is one of the few ways the procedural macros are simpler, since they're literally some Rust run by your compiler.

the__alchemist

3 hours ago

I like using or exposing macros when appropriate. They can simplify messy syntax, or prevent repetitions not allowed by the compiler directly. I can't get the syntax for writing them to stick. So, I am happy with letting LLMs handle this.

Sometimes the macros are for large chunks of code that uses a different type in a key place, or sometimes they're for cleaning up verbose function calls that will be made multiple times, so the important parts (e.g. the params) are obvious, instead of being mixed with boilerplate. In general, they're nice for papering over boilerplate. In particular, there's a pattern in embedded that involves a long expression with `try_into().unwrap()` for parsing bytes that I have a macro for. And another for managing RefCell<Mutex<Option>>> locks.

I prompt the LLM with the working, but repetitive or boilerplate-laden code, and it macros it: "Please write a macro that stops the repetition in this code block: ```rust ```. Here's a example of calling it: `do_thing!(a, b, c)`

Works every time!

afavour

2 hours ago

> I can't get the syntax for writing them to stick

Oh man, same. I wrote a macro crate then went back to it months later and couldn't make heads nor tails of anything I wrote. Something about the syntax just doesn't stick in my brain.

iambacktomyword

2 hours ago

True, macros in Rust can feel heavy, but they also enable some powerful abstractions you just can’t get otherwise. I guess the “don’t write macros” advice is more about avoiding overuse than rejecting them completely.

127

4 hours ago

Having done some Rust macros, the entire thing is such a huge hidden wart. Even very simple meta-programming in Rust need to be in their separate crate and has to use very complex syntax and invocation.

Also the whole "don't write macros" is such a hilarious statement given that entire Rust ecosystem is built on them.

ameliaquining

21 minutes ago

Macros by example, which is what this post is about, don't have to be in a separate crate.

airstrike

4 hours ago

I agree Rust macros are cursed in many different ways but

> given that entire Rust ecosystem is built on them.

I don't think the people saying "don't write macros" are the same people building an entire ecosystem on top of them

The iced crate has virtually zero macros by design.

pjmlp

3 hours ago

It is its own can of worms, and maybe it is due to me using the language on and off since 1992, but I find what is possible in C++23, much easier for metaprogramming as the few times I had to understand trying to implement Rust macros.

C++26 reflection will make this much easier, without having to depend in stuff like the syn crate.

I wonder if going with two macro systems, each with its own syntax and approach, was such a good idea.

IshKebab

2 hours ago

Maybe "don't write your own macros". I guess it's like C++ template meta programming. If you find yourself using that a lot, it's probably a bad sign. But also Eigen is pretty great.

spoiler

4 hours ago

Eh. I agree there's complexity in them, and that a lot of the ecosystem indirectly use them because of derive macros, but I wouldn't call it a wart, and the "syntax" for writing proc macros isn't that bad if you use the syn/quote crates. I agree that decl macros usually make me sigh and open the docs though

nicoburns

3 hours ago

> I agree that decl macros usually make me sigh and open the docs though

Declarative macros are very like regex's: both in that at first they seem incredibly dense and arcane but once you work out how to read them they're actually very simple, and in that the syntax is literally similar in that it's a list of tokens that must match sequentially.

iambacktomyword

2 hours ago

Yeah, Rust’s macro system feels like a double-edged sword — amazing power, but with a big learning curve. The tooling and syntax definitely make simple meta-programming harder than it should be.

iambacktomyword

2 hours ago

Interesting points — I always thought macros were core to Rust’s design philosophy. Do you think procedural macros will ever get simpler, or is the complexity kind of intentional for safety?

Communitivity

3 hours ago

Bjarne Stroustrup said "C makes it easy to shoot yourself in the foot; C++ makes it harder, but when you do it blows your whole leg off". The same is true of Rust macros. When you need them they're awesome, but you should almost never need them - add a new macro as a very last resort.

galangalalgol

2 hours ago

I agree with this, mostly because all the macros I would use are mostly written already. If const generic expressions arrive, a lot of those could go away too. In languages like lisp or zig where metaprogramming is a central feature, what do they do differently to make it better? Would those things have worked for rust?

jacquesm

2 hours ago

That's a hilarious quote. Thank you.

iambacktomyword

2 hours ago

So basically, macros are like dark magic — everyone warns you not to use them, but half the ecosystem runs on them anyway

Y_Y

4 hours ago

They should try writing a spellchecker first, I found the article difficult to read because of the high frequency of typos.

spelunker

12 minutes ago

It became distracting after the first two or three spelling errors, agreed.

CaptainOfCoit

4 hours ago

The spelling mistakes seems almost intentional. I've noticed that a lot of publications that used to publish obvious AI slop now are doing the same, I'm guessing it throws off some "LLM detectors" or similar.