5 个不稳定版本
0.4.0 | 2023年11月7日 |
---|---|
0.2.1 | 2019年1月6日 |
0.2.0 | 2019年1月6日 |
0.1.1 | 2019年1月5日 |
0.1.0 | 2019年1月5日 |
#83 在 过程宏 中
39,419 每月下载量
在 64 个crate中(通过 deno_ops)使用
19KB
359 行
proc-macro-rules
macro_rules
风格的过程宏语法匹配。
这个crate仍在开发中,可能不完整且可能存在bug!
示例
rules!(tokens => {
($finish:ident ($($found:ident)*) # [ $($inner:tt)* ] $($rest:tt)*) => {
for f in found {
do_something(finish, f, inner, rest[0]);
}
}
(foo $($bar:expr)?) => {
match bar {
Some(e) => foo_with_expr(e),
None => foo_no_expr(),
}
}
});
使用proc-macro-rules
将 proc-macro-rules = "0.3.0"
(或对于1.31和1.56之间的版本,使用proc-macro-rules = "0.2.1"
)添加到你的Cargo.toml中。
使用 use proc_macro_rules::rules
导入 rules
宏,然后使用 rules!(tokens => { branches });
,其中 tokens
是一个评估为 TokenStream
的表达式(例如过程宏定义中的参数)。
branches
中的每个分支应具有以下形式 ( pattern ) => { body }
,其中 pattern
是宏规则风格的模式(使用所有相同的元变量、AST节点、重复等语法),而 body
是当匹配到模式时执行的Rust代码。在 body
内部,模式中的任何元变量都绑定到来自 proc_macro2 或 syn crate的适当类型的变量。如果一个元变量在重复或可选子句中,它将被分别包裹在一个 Vec
或 Option
中。
例如,在上面的第一个分支中,ident
的类型是 syn::Ident
,而 inner
的类型是 Vec<proc_macro2::TokenTree>
。
构建和测试
使用 cargo build
进行构建,使用 cargo test --all
进行测试。
贡献
非常欢迎贡献!了解哪些内容缺失或错误将非常有益(一般来说,我们应该与 macro_rules
有相同的行为,因此任何不同的行为都是错误的)。问题、代码、文档、测试和纠正都欢迎。
依赖
约 295–760KB
约 18K SLoC