Rust 宏中相同变量的不同分隔符

Different separators for the same variable in Rust Macros

我想匹配这样的模式:

foo!(1,2,3;4,5,6;7,8,9); 

将为所有数字生成相同的代码,但是当有分号时,我想要 运行 的附加代码。这种模式可能吗?

我试过:

macro_rule! {
    foo ($($x:expr),*);*) => ...

但我似乎无法在右侧进行这项工作。

您从未解释过您现有代码的问题所在,所以我不知道在这个例子中要强调什么:

macro_rules! foo {
    ($($($x:expr),*);*) => {
        $(
            $(
                print!("{},", $x);
            )*
            println!("semi");
        )*
    }
}

fn main() {
    foo!(1,2,3;4,5,6;7,8,9); 
}

我可以从你的原始代码中指出一些事情:

  1. 叫做macro_rules!,不是macro_rule!
  2. 正在定义的宏的名称在原始 { 之前,而不是在之后。
  3. 与大多数编程一样,成对的定界符需要均匀匹配才能在语法上有效。

The Rust Programming Language, first edition 有几条有价值的信息。

定义宏的基本语法包含在 macros chapter; I strongly suggest you read the entire thing. It also links to the reference 中,其中包含一些更底层的细节。

与您的问题最相关的部分是:

Repetition

The repetition operator follows two principal rules:

  1. $(...)* walks through one "layer" of repetitions, for all of the $names it contains, in lockstep, and
  2. each $name must be under at least as many $(...)*s as it was matched against. If it is under more, it’ll be duplicated, as appropriate.