gpt4 book ai didi

rust - 如何创建 proc_macro_attribute?

转载 作者:行者123 更新时间:2023-11-29 08:02:21 24 4
gpt4 key购买 nike

现在 proc_macros have been stabilized , 如何创造这样的东西?

据我所知,可以选择将 #[proc_macro_attribute] 注释放在 fn whatsitsname(attrs: TokenStream, code: TokenStream) -> TokenStream,但我该如何注册呢?如何添加自定义属性?

最佳答案

Rust 编译器有一个相当完整的 test suite .在寻找新引入的功能示例时,我经常从这里开始:

$ rg -c proc_macro_attribute
src/test/run-pass-fulldeps/auxiliary/proc_macro_def.rs:2
src/test/ui-fulldeps/auxiliary/attr_proc_macro.rs:1
[... 35 other matches ...]

这是一个完整的例子:

$ tree
.
├── Cargo.toml
├── my_macro
│   ├── Cargo.toml
│   ├── src
│   │   └── lib.rs
└── src
└── main.rs

Cargo.toml

我们添加了对宏定义箱的依赖。

[package]
name = "foo"
version = "0.1.0"
authors = ["An Devloper <an.devloper@example.com>"]

[dependencies]
my_macro = { path = "my_macro" }

src/main.rs

我们导入属性宏并将其添加到函数中。

#[macro_use]
extern crate my_macro;

#[log_entry_and_exit(hello, "world")]
fn this_will_be_destroyed() -> i32 {
42
}

fn main() {
dummy()
}

my_macro/Cargo.toml

我们将crate_type指定为proc_macro

[package]
name = "my_macro"
version = "0.1.0"
authors = ["An Devloper <an.devloper@example.com>"]

[lib]
crate_type = ["proc-macro"]

my_macro/src/lib.rs

我们为每个应该是宏的函数添加#[proc_macro_attribute]

extern crate proc_macro;

use proc_macro::*;

#[proc_macro_attribute]
pub fn log_entry_and_exit(args: TokenStream, input: TokenStream) -> TokenStream {
let x = format!(r#"
fn dummy() {{
println!("entering");
println!("args tokens: {{}}", {args});
println!("input tokens: {{}}", {input});
println!("exiting");
}}
"#,
args = args.into_iter().count(),
input = input.into_iter().count(),
);

x.parse().expect("Generated invalid tokens")
}

cargo 运行

entering
args tokens: 3
input tokens: 7
exiting

“困难”部分是将 TokenStream 转化为有用的东西,然后输出同样有用的东西。 crate synquote是这两项任务的当前黄金标准。 macros chapter of The Rust Programming Language 中介绍了处理 TokenStream以及API documentation .

还有 #[proc_macro],它采用以下形式的函数:

#[proc_macro]
pub fn the_name_of_the_macro(input: TokenStream) -> TokenStream

并且可以作为 the_name_of_the_macro!(...) 调用。

关于rust - 如何创建 proc_macro_attribute?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52585719/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com