我正在尝试编写一组Rust宏来以特殊方式执行某些代码。目前,我正是这样写的。
macro_rules! macro_stmt{
([$e:expr]) => {
// do something ...
}
}
并将其称为
macro_stmt!([...]);
let var = macro_stmt!([...]);
macro_stmt!([...]);
// etc...
哪个好极了!本质上,我正在以特殊方式在方括号内运行一个表达式(省略号是一些未指定代码的占位符),macro_stmt
宏已经很好用了。
我希望能够做的是编写一个宏,以便我可以像代码块一样运行它:
macro_rules! macro {
// some rule to call macro_stmt!
// this pattern isn't correct, BTW
($($line:stmt);+;) => {
$(macro_stmt($line);)+
}
}
并将其命名为
macro! {
[...];
let var = [...];
[...];
// etc...
}
但是编译器对我大吼大叫stmt
片段不正确的语法作为'数组的内容'不是正确的逗号分隔格式。
有没有一种方法可以在不检查语法的情况下逐行调用macro_stmt
?没有let var =
的行只会调用macro_stmt()
,但带有let
的行会在其前面添加相同的let var = macro_stmt()
macro
的预期第一次扩展将是
macro_stmt!([...]);
let var = macro_stmt!([...]);
macro_stmt!([...]);
这甚至可能吗?