是否可以在Rust中写入链式比较宏?

是否可以在Rust中写入链式比较宏?,rust,macros,Rust,Macros,在rust中,可以通过或我认为这在技术上是可能的,但我不确定我个人是否会这样做。 处理所有运算符而不匹配一些不应该工作的内容,例如cond!(a+b),cond!(a) 或条件!()我必须非常详细,并且使用递归宏。可以简化初始(non@recur)情况,但我担心做错事会导致无限递归 macro_rules! cond { ( @recur $x:ident ) => { true }; ( @recur $x:ident < $y:ident $($tail:tt)*

在rust中,可以通过
我认为这在技术上是可能的,但我不确定我个人是否会这样做。
处理所有运算符而不匹配一些不应该工作的内容,例如
cond!(a+b)
cond!(a) 
条件!()
我必须非常详细,并且使用递归宏。可以简化初始(non
@recur
)情况,但我担心做错事会导致无限递归

macro_rules! cond {
    ( @recur $x:ident ) => { true };
    ( @recur $x:ident < $y:ident $($tail:tt)* ) => { ($x < $y) && cond!( @recur $y $($tail)*) };
    ( @recur $x:ident > $y:ident $($tail:tt)* ) => { ($x > $y) && cond!( @recur $y $($tail)*) };
    ( @recur $x:ident <= $y:ident $($tail:tt)* ) => { ($x <= $y) && cond!( @recur $y $($tail)*) };
    ( @recur $x:ident >= $y:ident $($tail:tt)* ) => { ($x >= $y) && cond!( @recur $y $($tail)*) };
    ( @recur $x:ident == $y:ident $($tail:tt)* ) => { ($x == $y) && cond!( @recur $y $($tail)*) };
    ( $x:ident < $y:ident $($tail:tt)* ) => { ($x < $y) && cond!( @recur $y $($tail)*) };
    ( $x:ident > $y:ident $($tail:tt)* ) => { ($x > $y) && cond!( @recur $y $($tail)*) };
    ( $x:ident <= $y:ident $($tail:tt)* ) => { ($x <= $y) && cond!( @recur $y $($tail)*) };
    ( $x:ident >= $y:ident $($tail:tt)* ) => { ($x >= $y) && cond!( @recur $y $($tail)*) };
    ( $x:ident == $y:ident $($tail:tt)* ) => { ($x == $y) && cond!( @recur $y $($tail)*) };
}

fn main() {
    let x = 3;
    let y = 1;
    let z = -3;
    println!("(z <= x > y) = {}", cond!(z <= x > y));
}

macro\u规则!康德{
(@recur$x:ident)=>{true};
(@recur$x:ident<$y:ident$($tail:tt)*)=>{($x<$y)和&cond!(@recur$y$($tail)*)};
(@recur$x:ident>$y:ident$($tail:tt)*)=>{($x>$y)和&cond!(@recur$y$($tail)*)};
(@recur$x:ident{($x=$y:ident$($tail:tt)*)=>{($x>=$y)&&cond!(@recur$y$($tail)*)};
(@recur$x:ident==y:ident$($tail:tt)*)=>{($x==y)和&cond!(@recur$y$($tail)*)};
($x:ident<$y:ident$($tail:tt)*)=>{($x<$y)和&cond!(@recury$y$($tail)*)};
($x:ident>$y:ident$($tail:tt)*)=>{($x>$y)和&cond!(@recury$y$($tail)*)};
($x:ident{($x=$y:ident$($tail:tt)*)=>{($x>=$y)和&cond!(@recury$y$($tail)*)};
($x:ident==$y:ident$($tail:tt)*)=>{($x==$y)和&cond!(@recury$y$($tail)*)};
}
fn main(){
设x=3;
设y=1;
设z=-3;
println!(“(zy)={}),cond!(zy));
}

我认为,只要您小心使用
cond
的参数,以下内容就可以满足您的期望

它使用
tt
(对于参数
运算符0
)来匹配
{
($x$Operator 0$x0)
};
($x:ident$operator0:tt$x0:ident$($operator1:tt$x1:ident)*)=>{
($x$operator0$x0)和&cond!($x0$($operator1$x1)*)
};
}
fn main(){
设x=3;
设y=1;
设z=-3;
断言(cond!(zy),true);
}

可以。您需要对操作员类型使用
tt

macro_rules! cond {
    (@rec ($head:expr) $last:ident $op:tt $next:ident $($tail:tt)*) => {
        cond!(@rec (($head) && ($last $op $next)) $next $($tail)*)
    };
    (@rec ($head:expr) $last:ident) => { $head };
    ($first:ident $op:tt $next:ident $($tail:tt)*) => {
        cond!(@rec ($first $op $next) $next $($tail)*)
    }
}

fn main() {
    let x = 3;
    let y = 1;
    let z = -3;
    println!("(z <= x > y) = {}", cond!(z <= x > y));
}
宏规则!条件{
(@rec($head:expr)$last:ident$op:tt$next:ident$($tail:tt)*)=>{
cond!(@rec(($head)和($last$op$next))$next$($tail)*)
};
(@rec($head:expr)$last:ident)=>{$head};
($first:ident$op:tt$next:ident$($tail:tt)*)=>{
cond!(@rec($first$op$next)$next$($tail)*)
}
}
fn main(){
设x=3;
设y=1;
设z=-3;
println!(“(zy)={}),cond!(zy));
}


您还可以阅读更高级的宏模式。

也许您可以修改您的示例以支持变量比较运算符。这允许使用一些可能有问题的奇怪构造,例如
cond!(x+y)
。但它确实很简洁。
macro_rules! cond {
    (@rec ($head:expr) $last:ident $op:tt $next:ident $($tail:tt)*) => {
        cond!(@rec (($head) && ($last $op $next)) $next $($tail)*)
    };
    (@rec ($head:expr) $last:ident) => { $head };
    ($first:ident $op:tt $next:ident $($tail:tt)*) => {
        cond!(@rec ($first $op $next) $next $($tail)*)
    }
}

fn main() {
    let x = 3;
    let y = 1;
    let z = -3;
    println!("(z <= x > y) = {}", cond!(z <= x > y));
}