8

我开始学习 Rust 宏,但文档有些有限。这很好——我猜它们是一个专家功能。虽然我可以进行基本的代码生成、特征的实现等,但一些内置宏似乎远不止这些,例如各种打印宏,它们检查字符串文字并将其用于代码扩展。

我查看了源代码print!,它调用了另一个名为format_args. 不幸的是,这似乎不是在“纯 Rust”中构建的,评论只是说“编译器内置”。

是否可以编写像print!纯 Rust 宏一样复杂的东西?如果是这样,它会怎么做?

我实际上对构建“编译时树”很感兴趣——基本上将某些固定字符串识别为在编译时固定的“关键字”。这将是高性能的(可能),但主要是我只对代码生成感兴趣。

4

2 回答 2

4

format_args在编译器本身的 libsyntax_ext crate 中实现。该名称在register_builtins函数中注册,处理它的代码在expand_format_args函数中有其入口点。

无法使用该macro_rules!构造定义执行如此详细的语法处理的宏。它们可以用程序宏定义;但是,此功能目前不稳定(只能与 nightly 编译器一起使用,并且会发生突然和未宣布的更改)并且文档很少。

于 2018-05-26T21:56:25.643 回答
2

Rust 宏无法解析字符串文字,因此无法创建直接的 Rust 等价于format_args!.

您可以做的是使用宏将类似函数调用的语法转换为以某种方式表示 Rust 类型系统中的可变参数列表的东西(例如,作为异构单链表或构建器类型) . 然后可以将其与格式字符串一起传递给常规的 Rust 函数。但是您将无法以这种方式实现格式字符串的编译时类型检查。

于 2018-05-26T20:12:08.910 回答