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

2022-09-01 22:40:22 +08:00
 lasuar
macro_rules! xxx{
    ($e:expr) => {
        if $e > 0 {
            xxx!( $e-1 );
        };
    };
}
xxx!(1);

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

if 1 - 1 - 1 - 1 - 1 - ...
1344 次点击
所在节点    Rust
5 条回复
wineway
2022-09-02 06:41:40 +08:00
没写过,盲猜模式匹配出两个分支
SingeeKing
2022-09-02 08:59:41 +08:00
编译器在编译时不知道 $e 的结果
DsuineGP
2022-09-02 09:57:42 +08:00
我记得模版宏是无法做编译器计算的,只是简单的根据模式匹配的结果生成代码
要做编译器计算需要用过程宏
whoami9894
2022-09-02 10:37:59 +08:00
大多数语言的宏都是正则序,先展开,后求值
lasuar
2022-09-02 11:02:07 +08:00
@SingeeKing
@DsuineGP
@whoami9894
感谢回复,昨儿在 tg 上也问到了,大概明白了。说是要过程宏才能拿到值

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/877121

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX