`:expr`后跟`:tt`,`expr`片段不允许

时间:2017-10-10 13:04:27

标签: macros rust

我正在尝试编写支持简单语法的宏,如:

boo: 3 and foo: go or bar: 4+2

这就是我的尝试:

macro_rules! solr {
    ($TOPIC:ident : $VALUE:expr $($rest:tt)*) => {
        println!("{} {}", stringify!($TOPIC), stringify!($VALUE));
    }
}

fn main() {
    solr!(
        boo: "hola!"
    );
}

Playground

我收到此错误:

error: `$VALUE:expr` is followed by `$rest:tt`, which is not allowed for `expr` fragments
 --> src/main.rs:2:35
  |
2 |     ($TOPIC:ident : $VALUE:expr $($rest:tt)*) => {
  |                                   ^^^^^^^^

这是有道理的,但我需要能够接受一个表达式并将句子的其余部分再次传递给宏来完成给定的句子。

我如何支持该语法或改变宏?

1 个答案:

答案 0 :(得分:4)

  

我如何支持该语法或改变宏?

你做不到。没有解决方法。没有诀窍。宏系统专门写入阻止你这样做。问题是在表达式(或类型等)之后允许任意标记有效地防止Rust开发人员永远扩展语言语法,同时保留向后兼容性。因此,它是被禁止的。

您可以更改输入语法,使其在表达式之后具有可接受的终止标记(例如,;),或更改为过程宏(并重新定义)宏调用作为项目的#[derive]属性。)