我开始学习 Rust 宏,但文档有些有限。这很好——我想它们是一个专家功能。虽然我可以进行基本的代码生成、特征的实现等,但一些内置宏似乎远远超出了这些,例如各种打印宏,它们检查字符串文字并将其用于代码扩展。
我在看的来源print! https://github.com/rust-lang/rust/blob/1.26.0/src/libstd/macros.rs它调用另一个宏format_args
。不幸的是,这似乎不是用“纯 Rust”构建的,注释只是说“编译器内置”。
是否可以写出像这样复杂的东西print!
在纯 Rust 宏中?如果是的话,会怎样做呢?
我实际上对构建一个“编译时特里结构”感兴趣——基本上将某些固定字符串识别为在编译时固定的“关键字”。这将是高性能的(可能),但大多数情况下我只对代码生成感兴趣。
format_args
在编译器本身的 libsyntax_ext 箱中实现。该名称已注册在register_builtins功能 https://github.com/rust-lang/rust/blob/e0635188ed30e083245482218a0de9237f14ce90/src/libsyntax_ext/lib.rs#L129,处理它的代码的入口点位于expand_format_args功能 https://github.com/rust-lang/rust/blob/1e504d301c07f84630ff0e35f10d2d69688887d6/src/libsyntax_ext/format.rs#L679.
进行如此详细的语法处理的宏不能使用macro_rules!
构造。它们可以定义为程序宏 https://github.com/rust-lang/rust/blob/master/src/doc/unstable-book/src/language-features/proc-macro.md;然而,此功能目前不稳定(只能与夜间编译器一起使用,并且可能会发生突然且未经通知的更改)并且记录很少。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)