是否有可能在纯Rust宏中编写像`print!`这样复杂的东西?

时间:2018-05-26 18:14:16

标签: rust code-generation rust-macros

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

我查看了the source for print!,并调用另一个名为format_args的宏。不幸的是,这似乎并没有建立在"纯Rust"评论只是说"内置编译器。"

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

我真的有兴趣建立一个"编译时间trie" - 基本上将某些固定字符串识别为"关键字"在编译时修复。这可能是高性能的(可能),但主要是我对代码生成感兴趣。

2 个答案:

答案 0 :(得分:4)

format_args在编译器本身的libsyntax_ext包中实现。该名称已在register_builtins function中注册,处理它的代码的入口点位于expand_format_args function

无法使用macro_rules!构造定义执行此类详细语法处理的宏。它们可以用procedural macro定义;但是,此功能目前不稳定(只能与夜间编译器一起使用,并且会受到突然和未宣布的更改)并且相当稀疏。

答案 1 :(得分:2)

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

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