我刚开始学习Rust宏,但文档有些有限。这很好--我想,这是一个专家特性。虽然我可以进行基本的代码生成、特征的实现等等,但一些内置宏似乎远远超出了这些,比如各种print宏,它们检查字符串文字并将其用于代码扩展。
我查看了the source for print!,它调用了另一个名为format_args的宏。不幸的是,这似乎不是在"pure Rust“中构建的,注释只是说”编译器内置“。
有没有可能在一个纯Rust宏中编写像print!这样复杂的东西?如果是这样的话,会怎么做?
实际上,我对构建“编译时trie”很感兴趣--基本上将某些固定字符串识别为在编译时固定的“关键字”。这将是性能(可能),但最主要的是我只对代码生成感兴趣。
发布于 2018-05-27 05:56:26
format_args是在编译器本身的libsyntax_ext机箱中实现的。该名称在register_builtins function中注册,处理该名称的代码在expand_format_args function中具有入口点。
不能使用macro_rules!构造来定义执行这种详细语法处理的宏。它们可以用procedural macro来定义;但是,这个特性目前是不稳定的(只能与夜间编译器一起使用,并且会受到突然的、未宣布的更改的影响),并且文档非常稀少。
发布于 2018-05-27 04:12:09
Rust宏不能解析字符串文字,因此不可能创建format_args!的直接Rust等效项。
您可以使用宏将类似函数调用的语法转换为以某种方式表示Rust类型系统中的可变参数列表的内容(例如,作为异类单链表或构建器类型)。然后可以将其与格式字符串一起传递给常规的Rust函数。但是,您将无法以这种方式实现格式字符串的编译时类型检查。
https://stackoverflow.com/questions/50545742
复制相似问题