V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
lasuar
V2EX  ›  Rust

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

  •  
  •   lasuar · 2022-09-01 22:40:22 +08:00 · 1544 次点击
    这是一个创建于 843 天前的主题,其中的信息可能已经有所发展或是发生改变。
    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-09-02 06:41:40 +08:00 via iPhone
    没写过,盲猜模式匹配出两个分支
    SingeeKing
        2
    SingeeKing  
       2022-09-02 08:59:41 +08:00 via iPhone
    编译器在编译时不知道 $e 的结果
    DsuineGP
        3
    DsuineGP  
       2022-09-02 09:57:42 +08:00
    我记得模版宏是无法做编译器计算的,只是简单的根据模式匹配的结果生成代码
    要做编译器计算需要用过程宏
    whoami9894
        4
    whoami9894  
       2022-09-02 10:37:59 +08:00
    大多数语言的宏都是正则序,先展开,后求值
    lasuar
        5
    lasuar  
    OP
       2022-09-02 11:02:07 +08:00
    @SingeeKing
    @DsuineGP
    @whoami9894
    感谢回复,昨儿在 tg 上也问到了,大概明白了。说是要过程宏才能拿到值
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   844 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 21:06 · PVG 05:06 · LAX 13:06 · JFK 16:06
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.