Macros 可以定义一个处理语法格的宏吗?
我想定义一个宏Macros 可以定义一个处理语法格的宏吗?,macros,rust,Macros,Rust,我想定义一个宏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: i
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);
) *
);
}
这不起作用,因为我不能同时使用这两种语法 当您使用令牌流时,在这种情况下,将其留给递归来处理片段会更容易。例如,您可以执行以下操作:
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代码>,最后一个()=>{}
表示完成条件。谢谢您的回答。这管用!您的回答帮助我理解了rust宏的令牌流。遗憾的是,我还不能+1你的答案。