是否可以定义一个处理语法案例的宏?

Leo*_*d7E 4 macros rust

我想定义一个callme可以像这样应用的宏.

fn main() {
    let a=4;
    let b=5;
    callme!(
        a (b) => { a+b } ;
        a (b) => { a*b } ;
        a (b) ~ C
    );
}
Run Code Online (Sandbox Code Playgroud)

我不知道如何获得有效的宏定义callme.目前我正在尝试这样的事情:

macro_rules! callme {
    (
        $($A: ident ($B: ident) => {$E: expr}) ; *
    ) => (
        $(
            println!("{:?} {:?} {:?}", $A, $B, $E);
        ) *
    );
    (
        $($A: ident ($B: ident) ~ $Q: ident) ; *
    ) => (
        $(
            println!("We got {:?} . {:?} . {:?}", $A, $B, $Q);
        ) *
    );
}
Run Code Online (Sandbox Code Playgroud)

这不起作用,因为我不能同时使用这两种语法案例.

log*_*yth 8

当您使用令牌流时,在这种情况下,更容易将其留给递归来处理您的碎片.你可以这样做:

macro_rules! callme {
    ($A:ident ($B:ident) => { $E:expr }; $($rest:tt)*) => {
        println!("{:?} {:?} {:?}", $A, $B, $E);

        callme!($($rest)*);
    };
    ($A:ident ($B:ident) ~ $Q:ident; $($rest:tt)*) => {
        println!("We got {:?} . {:?} . {:?}", $A, $B, $Q);

        callme!($($rest)*);
    };
    () => {};
}

fn main() {
    let a=4;
    let b=5;
    let c = "C";
    callme!(
        a (b) => { a+b } ;
        a (b) => { a*b } ;
        a (b) ~ c;
    );
}
Run Code Online (Sandbox Code Playgroud)

(在操场上)

请注意,在每组令牌之后,您将收集所有剩余的令牌,并通过稍后的调用将其处理callme!,并使用final () => {}来指示完成条件.