This isn&#x27;t a procedural macro:  Procedural macros run Rust code to transform your program, and interact with the guts of the compiler (AST, etc).  That&#x27;s hopefully going to change to not be compiler-version specific, etc.<p>This is using a system known as &quot;macro_rules&quot; which are a system of &quot;expanding&quot; -- in some ways it&#x27;s a fancier version of the C preprocessor, but also resembling the Lisp&#x2F;Racket macro system to some degree too.<p>Let&#x27;s take a random little piece of that code from the post and talk about it:<p><pre><code>    macro_rules! codelen {
        () =&gt; { 0 };
        ( $($c:expr),+ ) =&gt; { [$($c),+].len() };
    }
</code></pre>
This declares a new macro substitution rule called `codelen`.
Without going into too much depth, that&#x27;s defining rules (on the left hand of the `=&gt;`) and saying what code to expand them into, on the other side.  The first replaces `()` with `{0};`, just a simple substitution. In the second rule, the `$($variable),+ is the essential construct here, letting you operate on sequences of input stuff.<p>It&#x27;s a little hard to read -- writing your own macros in Rust is a little bit complicated and I don&#x27;t think it&#x27;s actually something that should be done often.  You can write little DSLs with it for sure.  This variety is going to stick around and will keep working.  It is called macro_rules! and not just macro! to leave that name free for a future, enhanced way to <i>write</i> macros, though.