freemoon
V2EX  ›  Rust

[Rust] 请教如何正确使用宏递归

By freemoon at 2022 年 9 月 1 日 · 2795 次点击
macro_rules! xxx{
    ($e:expr) => {
        if $e > 0 {
            xxx!( $e-1 );
        };
    };
}
xxx!(1);

这个代码为什么死递归?通过 trace_macro 发现 $e > 0 在编译器没有真正执行,而不是不断的拼接为

if 1 - 1 - 1 - 1 - 1 - ...
5 条回复  •  2022-09-02 11:02:07 +08:00
wineway
   1
wineway  
   2022 年 9 月 2 日 via iPhone
没写过,盲猜模式匹配出两个分支
SingeeKing
   2
SingeeKing  
   2022 年 9 月 2 日 via iPhone
编译器在编译时不知道 $e 的结果
DsuineGP
   3
DsuineGP  
   2022 年 9 月 2 日
我记得模版宏是无法做编译器计算的,只是简单的根据模式匹配的结果生成代码
要做编译器计算需要用过程宏
whoami9894
   4
whoami9894  
   2022 年 9 月 2 日
大多数语言的宏都是正则序,先展开,后求值
freemoon
   5
freemoon  
OP
   2022 年 9 月 2 日
@SingeeKing
@DsuineGP
@whoami9894
感谢回复,昨儿在 tg 上也问到了,大概明白了。说是要过程宏才能拿到值
© 2026 V2EX · 30ms · 3.9.8.5