V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
freemoon
V2EX  ›  Rust

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

  •  
  •   freemoon · Sep 1, 2022 · 2382 views
    This topic created in 1346 days ago, the information mentioned may be changed or developed.
    macro_rules! xxx{
        ($e:expr) => {
            if $e > 0 {
                xxx!( $e-1 );
            };
        };
    }
    xxx!(1);
    

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

    if 1 - 1 - 1 - 1 - 1 - ...
    
    5 replies    2022-09-02 11:02:07 +08:00
    wineway
        1
    wineway  
       Sep 2, 2022 via iPhone
    没写过,盲猜模式匹配出两个分支
    SingeeKing
        2
    SingeeKing  
    PRO
       Sep 2, 2022 via iPhone
    编译器在编译时不知道 $e 的结果
    DsuineGP
        3
    DsuineGP  
       Sep 2, 2022
    我记得模版宏是无法做编译器计算的,只是简单的根据模式匹配的结果生成代码
    要做编译器计算需要用过程宏
    whoami9894
        4
    whoami9894  
       Sep 2, 2022
    大多数语言的宏都是正则序,先展开,后求值
    freemoon
        5
    freemoon  
    OP
       Sep 2, 2022
    @SingeeKing
    @DsuineGP
    @whoami9894
    感谢回复,昨儿在 tg 上也问到了,大概明白了。说是要过程宏才能拿到值
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   3019 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 33ms · UTC 03:58 · PVG 11:58 · LAX 20:58 · JFK 23:58
    ♥ Do have faith in what you're doing.