Building Rust Procedural Macros from the Grounds Up

(learnix-os.com)

47 points | by Sagi21805 5 days ago

3 comments

  • mmastrac 25 minutes ago
    As someone who has spent a _lot_ of time writing declarative and procedural macros, the important thing to ask before digging into a macro is whether you need a procedural macro at all.

    Complex proc macros absolutely do slow builds down. In many cases, a proc macro only need to be a stub that can delegate to a declarative macro.

    You may not need to use syn/quote, but if you are doing any sort of processing/parsing of Rust code you pretty much need to.

    FWIW, I really hope that the Rust project focused on finer-grained token matching in declarative macros so we can migrate most proc_macro code away. The macro system is powerful, but nowhere near where it needs to be.

    • Sagi21805 15 minutes ago
      Yea that's sound about right

      The macro explained in that section was mainly for me to learn macros, and save up some boilerplate with nice syntax.

      • mmastrac 2 minutes ago
        Great writeup! Apologies if it came across as a criticism of the writeup itself, more of a frustration of years in the proc_macro space.

        It's surprising how little information exists out there about proc_macros in general.

  • Sagi21805 5 days ago
    During the development of Learnix operating system I needed to represent bitflags inside some structures.

    While there were alternatives with 3rd party libraries, the goal of the project is to implement and learn as much as I can.

    Most of the guides I found online explained the concept great, but created only a simple macro as an example. So I decided to write about it myself too, with a real usage to create a bitfields attribute proc-macro, that takes a struct and turns it into bitfields.

    Hope you will have a great read!

    • an_d_rew 1 hour ago
      Very nice writeup, thank you for the time and effort!
      • Sagi21805 27 minutes ago
        Thanks for the warming comment!
  • swordlucky666 3 hours ago
    [dead]