我想定义一个可以像这样应用的宏callme
。
fn main() {
let a=4;
let b=5;
callme!(
a (b) => { a+b } ;
a (b) => { a*b } ;
a (b) ~ C
);
}
我不知道如何为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);
) *
);
}
这不起作用,因为我不能同时使用这两种语法案例。
答案 0 :(得分: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;
);
}
请注意,在每组令牌之后,您会收集所有剩余的令牌,并通过稍后调用callme!
让其处理,最后() => {}
表示完成条件。