我可以在Rust宏中重复比赛吗?我希望能够执行以下操作:
#include <stdio.h>
int main(void)
{
FILE *fp = fopen("mybuffer.txt", "r"); // should check for open failure
char buffer[100] = { '\0' }; // zero to avoid UB when printing all chars
fgets(buffer, sizeof buffer, fp);
// could just as well use:
// strInput(fp, buffer, sizeof(buffer));
for (size_t i = 0; i < sizeof buffer; i++) {
if (buffer[i] == '\0') {
putchar('*'); // some character not expected in input
}
else {
putchar(buffer[i]);
}
}
putchar('\n');
return 0;
}
基本上是任意数量的以分号分隔的语句,每个语句由不同的规则处理。
我知道我可以有多个my_dsl! {
foo <other tokens>;
bar <other tokens>;
foo <other tokens>;
...
}
,foo!()
宏-每个语句都可以,但是理想情况下,我希望避免这种情况。
我在想是否可以捕获类似bar!()
的东西,但不包括分号,然后再委托给其他宏?
答案 0 :(得分:3)
您应该阅读The Little Book of Rust Macros,尤其是问题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)*);
}
};
}