1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#[macro_export] macro_rules! rec {
    (@mkstruct (
        [$firstlet:ident, $($letter:ident),*],
        { }
    ) -> ([$($letter_out:ident),*], {$($id_out:ident : $val_out:expr),*})) => {
        {
            struct Rec<$($letter_out,)*> { $($id_out : $letter_out),* }
            Rec { $($id_out : $val_out),* }
        }
    };
    (@mkstruct (
        [ $letter0:ident, $($letter:ident),* ],
        { $id0:ident : $val0:expr $(,$id:ident : $val:expr)* }
    ) -> ([ $($letter_out:ident),* ], { $($id_out:ident : $val_out:expr),* })) => {
        rec!(@mkstruct([$($letter),*], { $($id : $val),* }) -> (
            [$letter0 $(,$letter_out)*],
            { $id0 : $val0 $(,$id_out : $val_out)* }
        ));
    };
    { $($id:ident : $val:expr),+ } => {
        rec!(@mkstruct([A,B,C,D,E,F,G,H,I,J,K,L], { $($id : $val),* } ) -> ([],{}) );
    }
}