Можно ли повторить сопоставление по нескольким правилам в макросе?

Могу ли я повторить матч в макросе Rust? Я хочу иметь возможность сделать что-то вроде:

my_dsl! {
    foo <other tokens>;
    bar <other tokens>;
    foo <other tokens>;
    ...
}

В основном, произвольное количество операторов, разделенных точкой с запятой, и каждый оператор обрабатывается по разным правилам.

Я знаю, что могу иметь несколько foo!(), bar!() макросы - каждый на утверждение, но в идеале я бы хотел этого избежать.

Я думал, смогу ли я захватить что-то вроде $($t:tt)*, но исключая точку с запятой, а затем делегировать другим макросам?

1 ответ

Решение

Вы должны прочитать "Маленькую книгу макросов ржавчины" и специально для вашего вопроса раздел 4.2: Инкрементные измельчители ТТ.

Например:

macro_rules! my_dsl {
    () => {};
    (foo $name:ident; $($tail:tt)*) => {
        {
            println!(concat!("foo ", stringify!($name));
            my_dsl!($($tail)*);
        }
    };
    (bar $name:ident; $($tail:tt)*) => {
        {
            println!(concat!("bar ", stringify!($name));
            my_dsl!($($tail)*);
        }
    };
}
Другие вопросы по тегам