#macro #语法 #metamacros

big_mac

用于编写复杂宏的元宏工具集

1 个不稳定版本

0.1.7 2021年11月14日
0.1.6 2021年11月14日

#1671 in Rust 模式


chain_linq 中使用

MIT 许可证

22KB
482

Big Mac

此包包含 branching_parser! 元宏,可用于用少量代码创建复杂的宏。

要使用此宏,请按如下方式调用它(以下示例以 chain_linq 的参数为例)

示例解析器转换

"from x in xs select x * 2" => "from {x} in {xs}, select {x * 2},"

branching_parser!{
    @unroll
    path::to::this::module; // (chain_linq;) (note the ; at the end)
    name_of_entrypoint_macro // (linq)
    name_of_parsing_macro // (linq_parser)
    name_of_filter_macro // (linq_filter)
    fully::qualified::destination::macro; // (chain_linq::linq_impl) (note the ; at the end)
    // {series of branch specifiers}
}

参数

  • @unroll 是一个指定符,用于选择 branching_parser 宏的入口点语法。

  • 模块路径用于正确设置宏调用。它应该是结果入口点、解析器和过滤器宏可以从公共位置访问的模块名称(例如,你在其中调用 branching_parser! 的模块)

  • 路径后面的 3 个名称是选择输出宏名称的方式。虽然解析器和过滤器必须对结果宏的消费者公开,但它们不需要手动调用。

  • 目标宏路径是将结果解析后的标记流引入的宏;例如,将 core::stringify 用于您的宏,使其最终评估为字符串。

规则

分支指定符决定了结果宏的语法;它们采用必须遵循某些规则的分支形式,以创建有用的结果。

  • 每个起始分支都位于一个新的 {} 中。

  • 每个分支必须以除 # 之外的其他标记开始。

  • 非起始标记可以用 # 替换,以表示要收集的标记字符串。

  • 可以用空 {} 结尾 #,表示它是终端。

  • 分支可以以除 # 之外的其他标记结束。

示例

例如,LINQ 的 select 语句(形式为 select # [into #],其中 [] 表示可选)可以表示为

{
    select
    {
        ##
        {}
        {
            into
            {
                ## {}
            }
        }
    }
}

另一个示例是 LINQ 的 group by(group # by # [into #])

{
    group
    {
        ##
        {
            by
            {
                ##
                {}
                {
                    into
                    {
                        ## {}
                    }
                }
            }
        }
    }
}

最后,一个词终端链的示例是 LINQ 的 orderby(orderby # [ascending | descending])

{
    orderby
    {
        ##
        {}
        {
            ascending
        }
        {
            descending
        }
    }
}

更多示例可以在 chain_linq 的仓库中找到。

没有运行时依赖