Можно ли повторить сопоставление по нескольким правилам в макросе?
Могу ли я повторить матч в макросе 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)*);
}
};
}