我开始学习Rust宏,但文档有些限制。这很好 - 我猜他们是专家。虽然我可以进行基本的代码生成,特性的实现等等,但是一些内置宏似乎远远超出了它,例如各种打印宏,它检查字符串文字并将其用于代码扩展。
我查看了the source for print!
,并调用另一个名为format_args
的宏。不幸的是,这似乎并没有建立在"纯Rust"评论只是说"内置编译器。"
是否可以在纯Rust宏中编写与print!
一样复杂的东西?如果是这样,它会怎么做?
我真的有兴趣建立一个"编译时间trie" - 基本上将某些固定字符串识别为"关键字"在编译时修复。这可能是高性能的(可能),但主要是我对代码生成感兴趣。
答案 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函数。但是你不能用这种方式实现格式字符串的编译时类型检查。