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过程宏

Download history 8897/week @ 2024-04-08 10349/week @ 2024-04-15 11558/week @ 2024-04-22 10761/week @ 2024-04-29 9766/week @ 2024-05-06 12377/week @ 2024-05-13 20773/week @ 2024-05-20 10972/week @ 2024-05-27 9488/week @ 2024-06-03 15993/week @ 2024-06-10 10908/week @ 2024-06-17 11604/week @ 2024-06-24 10447/week @ 2024-07-01 12085/week @ 2024-07-08 6944/week @ 2024-07-15 9456/week @ 2024-07-22

39,419 每月下载量
64 个crate中(通过 deno_ops)使用

Apache-2.0/MIT

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_macro2syn crate的适当类型的变量。如果一个元变量在重复或可选子句中,它将被分别包裹在一个 VecOption 中。

例如,在上面的第一个分支中,ident 的类型是 syn::Ident,而 inner 的类型是 Vec<proc_macro2::TokenTree>

构建和测试

使用 cargo build 进行构建,使用 cargo test --all 进行测试。

贡献

非常欢迎贡献!了解哪些内容缺失或错误将非常有益(一般来说,我们应该与 macro_rules 有相同的行为,因此任何不同的行为都是错误的)。问题、代码、文档、测试和纠正都欢迎。

依赖

约 295–760KB
约 18K SLoC