宏定义和过程宏有什么区别?

3
什么是过程宏和语法宏的区别?Rust将其宏系统称为"过程宏",但我见过其他文章将类似于Rust宏系统的系统称为语法宏。语法宏似乎在解析时可以访问全部或部分AST。这似乎就是Rust所使用的方式。

宏始终是语法的,所以这对我来说没有太多意义。除非他们的意思是你可以在宏中有一些自定义语法?嗯...无论如何,所有宏中的这部分都是相同的(有点),Rust的区别在于声明式 v 过程式宏。使用macro_rules!定义声明性宏,它们是简单(声明性)转换,因此它们大多是方便的助手。过程式宏是完整的Rust程序,操作令牌流。过程式宏更加强大,因为您可以使用整个编程语言。 - Masklinn
另外,由于声明式宏处理AST,它们具有一些语法限制,而过程宏则没有,因为编译器需要能够创建一个AST。 - Masklinn
@Masklinn 宏访问类型信息(不在Rust中)。然后它们就不是语法的了。但我同意这个问题需要澄清。 - Chayim Friedman
1个回答

5
Rust宏是语法层面的,它们作用于AST。
可能会让您在术语上困惑的是,Rust有两种不同的宏风格,它们的编写方式和使用方式不同。一种是带有规则的宏(也称为“例子宏”),是通过调用`macro_rules!`创建的。另一种是过程宏,它们被编写成处理`TokenStream`输入和输出的函数(可以用作属性、衍生或像函数一样使用)。
另请参阅:
- Rust Book中的 - Rust Reference中的过程宏示例宏

谢谢,那似乎是混淆的根源。 - perrymil

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接