我试着写一个像这样的简单的宏,以便于编写代码
enum Term {
Or(Box<Term>, Box<Term>),
And(Box<Term>, Box<Term>),
Value(u8),
}
macro_rules! term {
($value_1:expr & $value_2:expr) => {
Term::And(Box::new($value_1), Box::new($value_2))
};
($value_1:expr | $value_2: expr) => {
Term::Or(Box::new($value_1), Box::new($value_2))
};
($value: expr) => {
Term::Value($value)
};
}
但是,在我的模式中,我不能将&
或|
放在expr
之后。我尝试使用tt
,但它不起作用,因为我并不总是将一个标记放在$value
中。pat_param
似乎也不适用于&
。
唯一可行的选择似乎是使用(($value_1:expr) & ($value_2:expr))
,但如果我可以不使用额外的括号,那就更好了。
有什么办法吗?
1条答案
按热度按时间h79rfbju1#
不允许使用
&
以避免歧义,因此无法将&
作为声明性宏中expr
参数之后的直接标记。expr
和stmt
后面只能跟以下之一:=>
、,
或;
中的任意一个。