我可以使用宏来替换代码块中的特定表达式吗?

时间:2016-01-09 01:36:07

标签: macros rust

我正在尝试编写一组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!([...]);

这甚至可能吗?

0 个答案:

没有答案