我正在开始学习Rust的旅程。我碰到this line in Rust by Example:



为什么抽象语法树比字符串预处理更好?

最佳答案

如果您在C中有此代码:

#define X(A,B) A+B
int r = X(1,2) * 3;
r的值将为7,因为预处理器将其扩展为1+2 * 3,即1+(2*3)

在Rust中,您将拥有:
macro_rules! X { ($a:expr,$b:expr) => { $a+$b } }
let r = X!(1,2) * 3;

这将评估为9,因为编译器会将扩展解释为(1+2)*3。这是因为编译器知道宏的结果应该是一个完整的自包含表达式。

也就是说,C宏也可以这样定义:

#define X(A,B) ((A)+(B))

这样可以避免任何非显而易见的评估问题,包括因上下文而重新解释参数的情况。但是,当您使用宏时,您永远无法确定宏是否正确解释了每种可能的使用方式,因此很难说出任何给定的宏扩展将做什么。

通过使用AST节点而不是文本,Rust确保了这种歧义不会发生。

关于macros - 为什么基于抽象语法树的宏比基于字符串预处理的宏更好?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50512097/

10-14 06:17