3 个版本
0.3.2 | 2023 年 6 月 24 日 |
---|---|
0.3.1 | 2023 年 6 月 24 日 |
0.3.0 | 2023 年 6 月 24 日 |
#177 在 过程宏 中
14,190 每月下载量
19KB
359 行
proc-macro-rules
macro_rules
风格的过程宏语法匹配。
这个包还在开发中,可能不完整,也可能有错误!
示例
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
在您的 Cargo.toml 中添加 proc-macro-rules = "0.3.0"
(或 proc-macro-rules = "0.2.1"
对于 1.31 到 1.56 之间的版本)。
使用 use proc_macro_rules::rules
导入 rules
宏,然后使用 rules!(tokens => { branches });
,其中 tokens
是一个计算结果为 TokenStream
的表达式(例如过程宏定义中的参数)。
在 branches
中的每个分支应具有以下形式:( 模式 ) => { 主体 }
其中 模式
是宏规则风格的模式(使用相同的语法来表示元变量、抽象语法树节点、重复等),而 主体
是当模式匹配时执行的 Rust 代码。在 主体
中,模式中的任何元变量都绑定到来自 proc_macro2 或 syn 库的适当类型的变量。如果元变量位于重复或选项子句中,它将分别被包裹在 Vec
或 Option
中。
例如,在上面的例子中的第一个分支中,ident
的类型是 syn::Ident
,而 inner
的类型是 Vec<proc_macro2::TokenTree>
。
构建和测试
使用 cargo build
构建,使用 cargo test --all
测试。
贡献
欢迎贡献!了解缺少或错误的地方将很有帮助(通常我们应该有与 macro_rules
相同的行为,因此任何不同之处都是错误的)。问题、代码、文档、测试和纠正都受欢迎。
依赖关系
~0.3–0.8MB
~19K SLoC