[][src]Crate seq_macro

Imagine for-loops in a macro

This crate provides a seq! macro to repeat a fragment of source code and substitute into each repetition a sequential numeric counter.

#![feature(proc_macro_hygiene)]

use seq_macro::seq;

fn main() {
    let tuple = (1000, 100, 10);
    let mut sum = 0;

    // Expands to:
    //
    //     sum += tuple.0;
    //     sum += tuple.1;
    //     sum += tuple.2;
    //
    // This cannot be written using an ordinary for-loop because elements of
    // a tuple can only be accessed by their integer literal index, not by a
    // variable.
    seq!(N in 0..=2 {
        sum += tuple.N;
    });

    assert_eq!(sum, 1110);
}

There are just two more features to know about:

  • If the input tokens contain a section surrounded by #( ... )* then only that part is repeated.

  • The numeric counter can be pasted onto the end of some prefix to form sequential identifiers.

use seq_macro::seq;

seq!(N in 64..=127 {
    #[derive(Debug)]
    enum Demo {
        // Expands to Variant64, Variant65, ...
        #(
            Variant#N,
        )*
    }
});

fn main() {
    assert_eq!("Variant99", format!("{:?}", Demo::Variant99));
}

Macros

seq