Я думаю, что следующее делает то, что вы ожидаете , если вы осторожны с аргументами cond
.
. Использует tt
(для аргумента operator0
) для соответствует <
, <=
, >=
, et c. чтобы избежать повторения большого количества случаев, но tt
, конечно, совпадает и с другими токенами.
macro_rules! cond{
($x:ident $operator0:tt $x0:ident) => {
($x $operator0 $x0)
};
($x:ident $operator0:tt $x0:ident $($operator1:tt $x1:ident)*) => {
($x $operator0 $x0) && cond!($x0 $($operator1 $x1)*)
};
}
fn main() {
let x = 3;
let y = 1;
let z = -3;
assert_eq!(cond!(z <= x > y), true);
}