Можно ли повторить сопоставление по нескольким правилам в макросе? - PullRequest
0 голосов
/ 12 декабря 2018

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

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

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

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

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

1 Ответ

0 голосов
/ 12 декабря 2018

Вы должны прочитать Маленькая книга макросов ржавчины и специально для вашего вопроса раздел 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)*);
        }
    };
}
...