我试图编写一个宏,以重写特定的Rust控制流,但我很难匹配if
表达式。问题在于谓词是一个表达式,但一个expr
不允许跟随block
或{
。
我尽力了,在这里使用tt
:
macro_rules! branch {
(
if $pred:tt
$r1:block
else
$r2:block
) => {
if $pred {
$r1
} else {
$r2
}
};
}
这适用于单个令牌或分组谓词:
branch! {
if (foo == bar) {
1
} else {
2
}
}
如果该断言没有进行分组,则会失败:
branch! {
if foo == bar {
1
} else {
2
}
}
error: no rules expected the token `==`
我还尝试在谓词中使用了一个重复的 tt
模式:
macro_rules! branch {
(
if $($pred:tt)+
$r1:block
else
$r2:block
) => {
if $($pred)+ {
$r1
} else {
$r2
}
};
}
但这会产生一个错误,因为现在不清楚后续的块是否也要匹配 tt
:
error: local ambiguity: multiple parsing options: built-in NTs tt ('pred') or block ('r1').
有没有什么方法可以做到这一点,还是我必须发明一些特殊的语法来在宏中使用?