[HN Gopher] The Little Book of Rust Macros
___________________________________________________________________
The Little Book of Rust Macros
Author : DerekBickerton
Score : 140 points
Date : 2021-11-21 16:34 UTC (6 hours ago)
(HTM) web link (danielkeep.github.io)
(TXT) w3m dump (danielkeep.github.io)
| ncmncm wrote:
| Wondering when Rust macros will learn about types.
|
| Lisp macros, of course, know nothing about types, because, in
| old-school Lisp, there are, lexically, no types. But in Rust, at
| expansion time, types are usually absolutely nailed down.
| (...Unless the macro is expanding to a generic definition; but
| even then, there are named types, you just don't know what they
| would be bound to).
|
| Or maybe they do understand types, now? I haven't checked lately.
| alschwalm wrote:
| It is definitely also worth mentioning the now-stabilized
| procedural macros [1] (unless I missed where they are described).
| proc macros power some of the more complex macro usage in the
| rust ecosystem (like rocket and actix-webs router macros, any
| sort of custom derive, etc).
|
| [1]: https://doc.rust-lang.org/reference/procedural-macros.html
| manish_gill wrote:
| By co-incidence, I started reading the updated version of this
| book today! Fantastic resource.
|
| Question to experienced Rust people: What are some cool use-cases
| that you've seen for Macros?
| umanwizard wrote:
| Serde is really the killer app for rust macros IMO
| dagmx wrote:
| Serde is honestly just so amazing. It amazes a lot of people
| when I demo rust and show how trivial it is to read and write
| our existing configuration and data files
| loeg wrote:
| This is probably a relatively boring use case -- the C
| preprocessor could do basically the same thing -- but I've used
| macros to obviate some repetitive code in API bindings and
| FFIs.
| skohan wrote:
| I'm using proc macros to generate a parser implementation from
| a context-free grammar, I find it pretty neat.
| gizmo385 wrote:
| Is this open source anywhere? I'd love to take a look at the
| code. A compiler is on my short-list for my next project to
| use to learn rust.
| jgrant27 wrote:
| If you have used Rust in any real world capacity on actual
| projects you know that there are no "Little Books" when its comes
| to using Rust. An overly complex and unproductive language as
| much as C++.
| jen20 wrote:
| Absolutely not my experience. My experience is there is an
| initial large learning curve (2-3 weeks) and then you can be
| vastly more productive than any dynamic language, with better
| safety, a better library ecosystem, and better tooling.
| mijamo wrote:
| Both are overly broad generalization. If you are working on a
| backend for a web app I would certainly not recommend Rust
| and it would be a big loss of productivity compared to Python
| or JavaScript, or even Go.
|
| For a game it could fit in some part but you would be very
| limited by the ecosystem so I would also not recommend except
| if you really know what you are doing and have significant
| resources.
|
| For low level system programing it is pretty nice, and maybe
| the best alternative right now.
|
| For a compiler I would say it depends if performance is the
| main priority, in that case yes, otherwise no.
|
| There are plenty of other cases of course and for each the
| answer would be different.
|
| It is not really a general purpose language that you could
| use without worry for everything like Python, at least not
| yet.
| lokeg wrote:
| Using libraries is so much easier in rust compared to many
| other libraries due to rustdoc. I can trust the type
| signatures to show me the actual usage, I can trust the
| code snippets to not be outdated, and above all this is
| consistent for all code in the entire ecosystem.
|
| Almost always when I use python libraries I have to get
| used to a new documentation format, learn how to navigate
| it and so on. And then it has to be detailed enough to make
| up for the lack of type signatures. I cannot tell you how
| often I have to skim a significant portion of my
| dependencies' source just to use them. (Though there are
| counterexamples, stdlib and numpy in particular actually
| have okay docs)
| the_duke wrote:
| This was a great learning resource for macros in the early days
| of Rust when there was almost no official documentation.
|
| Nowadays anything that's a bit more complex should almost
| certainly use proc macros instead, which allow much saner
| implementations than complex, recursive macro shenanigans.
| pitaj wrote:
| Absolutely disagree. If it can be done, without sacrificing
| useability, without proc macros, that's the way it should be
| done. Proc macros don't play well with IDEs, add compilation
| time, introduce dependencies, and can be a security risk.
|
| There are things that can be done to improve proc macros, like
| executing them in a WASM runtime, but currently they should
| only be used when necessary.
| tialaramex wrote:
| On the other hand, procedural macros are the big guns and as
| such if you aim them wrong you are going to blow both feet off.
| A declarative macro is only at worst going to spew nonsense
| into your post-processed source where it was used - which the
| Rust tools are quite happy to show you - but a sufficiently bad
| proc macro could cause unlimited mayhem with no diagnostics
| available. I don't know if somebody is collecting the worst
| _mistakes_ they 've seen with proc macros, but m-ou-se's
| nightly-crimes! shows what sort of insanity is possible.
|
| [ https://github.com/m-ou-se/nightly-crimes nightly-crimes!
| blows away your compiler, running it again in a new environment
| where it will allow nightly features even though you've got a
| stable compiler installed... ]
| akiselev wrote:
| _> [ https://github.com/m-ou-se/nightly-crimes nightly-
| crimes! blows away your compiler, running it again in a new
| environment where it will allow nightly features even though
| you've got a stable compiler installed... ]_
|
| That macros have access to the entire language including
| arbitrary IO is the defining feature of proc macros (not
| without controversy). The insanity here is the Rust compiler
| team adding the `RUSTC_BOOTSTRAP` env var which is a hack
| used to bootstrap rustc using a stable compiler despite the
| nightly features used by the codebase.
|
| All nightly-crimes does is use `std::process::Command` to
| rerun the compiler with the variable set [1], which tells
| rustc to throw all concepts of stability out the window.
|
| I haven't been following developments but one of the ideas
| (even has a PoC iirc) was to distribute and run proc macros
| as web assembly to improve build times and prevent such
| shenanigans.
|
| [1] https://github.com/m-ou-se/nightly-crimes/blob/main/yolo-
| rus...
| ibraheemdev wrote:
| Note that this version of the book has not been updated since
| 2016. The updated version is here:
| https://veykril.github.io/tlborm/introduction.html
___________________________________________________________________
(page generated 2021-11-21 23:00 UTC)