Introducing crabtime, a novel way to write Rust macros

https://ferrisoft.com/blog/crate_crabtime

29 points · 6 comments · view on lemmy.world

6 Comments

Vorpal@programming.dev · 3 pts · 196d (1 reply)

Uh, this blog says "introducing", but this is hardly new. I have seen this crate around for a while, and https://crates.io/crates/crabtime/versions corroborates that.

Is this an old blog? I can't find a date on it.

SorteKanin@feddit.dk · 1 pts · 196d

Might not be new but it's not been posted here before :)

jenesaisquoi@feddit.org · 2 pts · 185d

Doesn't support derive macros, unfortunately.

MoSal@programming.dev · 2 pts · 196d (2 replies)

(slightly edited from initial version)

#![feature(macro_metavar_expr_concat)]
#![feature(macro_metavar_expr)]

macro_rules! gen_enums {
    ([$($name:ident)+]) => {
        gen_enums!(${count($name)}: [$($name)+]);
    };
    ($n:literal: [$($name:ident)+]) => {
        enum ${concat(Position, $n)} { $($name,)+ }
    };
    ($name:ident, $($tail:ident,)*) => {
        gen_enums!([$name $($tail)*]);
        gen_enums!($($tail,)*);
    };
    () => {};
}
SorteKanin@feddit.dk · 2 pts · 196d (1 reply)

Not nearly as readable though

MoSal@programming.dev · 4 pts · 196d

It was just a quick solution showing how to do it with one macro and zero dependencies, utilizing the power of meta variables. It probably can be made nicer.

Side Note: It's not directly relevant/needed here, but this also shows that maybe a theoretical $reverse{} meta variable can be useful with repeated patterns, to in this case generate the variants in the expected order.