1 个不稳定版本
0.1.7 | 2021年11月14日 |
---|---|
0.1.6 |
|
#1671 in Rust 模式
在 chain_linq 中使用
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 的仓库中找到。