我可以通过宏中的多个规则重复匹配吗?
Can I repeat matching by several rules in a macro?
我可以在 Rust 宏中重复匹配吗?我希望能够做类似的事情:
my_dsl! {
foo <other tokens>;
bar <other tokens>;
foo <other tokens>;
...
}
基本上,任意数量的分号分隔语句,每个语句由不同的规则处理。
我知道我可以有多个 foo!()
、bar!()
宏 - 每个语句都有一个,但理想情况下我想避免这种情况。
我在想是否可以捕获类似 $($t:tt)*,
但不包括分号的内容,然后委托给其他宏?
你应该阅读 The Little Book of Rust Macros and specifically for your question section 4.2: Incremental TT munchers。
例如:
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)*);
}
};
}
我可以在 Rust 宏中重复匹配吗?我希望能够做类似的事情:
my_dsl! {
foo <other tokens>;
bar <other tokens>;
foo <other tokens>;
...
}
基本上,任意数量的分号分隔语句,每个语句由不同的规则处理。
我知道我可以有多个 foo!()
、bar!()
宏 - 每个语句都有一个,但理想情况下我想避免这种情况。
我在想是否可以捕获类似 $($t:tt)*,
但不包括分号的内容,然后委托给其他宏?
你应该阅读 The Little Book of Rust Macros and specifically for your question section 4.2: Incremental TT munchers。
例如:
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)*);
}
};
}