`:expr` 后跟 `:tt`,这对于 `expr` 片段是不允许的

Afs*_*ani 3 macros rust

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

boo: 3 and foo: go or bar: 4+2
Run Code Online (Sandbox Code Playgroud)

这是我尝试过的:

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

fn main() {
    solr!(
        boo: "hola!"
    );
}
Run Code Online (Sandbox Code Playgroud)

操场

我收到此错误:

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

fn main() {
    solr!(
        boo: "hola!"
    );
}
Run Code Online (Sandbox Code Playgroud)

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

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

DK.*_*DK. 5

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

你不能。没有解决方法。没有诀窍。宏系统是专门为防止您这样做而编写的。的问题是,允许任意令牌的表达(或类型,除其他事项外)后有效地防止锈从开发商不断扩大语言的语法,同时保持向后兼容性。因此,这是禁止的。

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