4 个版本 (重大更改)

0.4.0 2024年1月26日
0.3.0 2024年1月18日
0.2.0 2024年1月4日
0.0.1 2023年12月26日

#1891 in 过程宏

每月下载量 33
7 个crate中使用 (通过 code-product)

MIT/Apache

46KB
798

代码产品

此crate提供两个功能

  1. A ,通过重复展开宏来生成代码。这是此crate的主要目标,因为它可以从其他proc宏方便地生成代码。语法也在其中。
  2. 独立的 product!{}product_items!{} 宏,使用库生成代码,因为它本身很有用。

使用案例

此宏系统用于生成以类似方式重复的样板代码。

产品展开示例

名称 product 是因为它展开为所有定义集合的乘积(每个乘以每个)。例如,有两个定义集合 'Foo 和 Bar' 和 'This 和 That',展示了不同的语法变体

# use code_product::product;
# trait Trait<T>{}
# struct This<T>(T); struct That<T>(T);
# struct Foo; struct Bar;
product!{
    // Rather elaborate form with named definitions:
    // define `Type` to expand to `This` and `That`
    $(Type: (This) (That))
    // and inline define `T` to expand to `Foo` and `Bar`
    impl Trait<$($T: (Foo)(Bar))> for $Type<$T> {}
}

# use code_product::product;
# trait Trait<T>{}
# struct This<T>(T); struct That<T>(T);
# struct Foo; struct Bar;
product!{
    // Alternative form inlining definition and reference by index:
    impl Trait<$((Foo)(Bar))> for $((This)(That))<$0> {}
}

上述任何一个都会展开四次,变为

# trait Trait<T>{}
# struct This<T>(T); struct That<T>(T);
# struct Foo; struct Bar;
impl Trait<Foo> for This<Foo> {}
impl Trait<Foo> for That<Foo> {}
impl Trait<Bar> for This<Bar> {}
impl Trait<Bar> for That<Bar> {}

线性展开示例

linear 扩展作用域中,方括号内每个定义必须定义相同数量的项目。然后它们一起迭代。这为展开提供了更多控制,因为必须手动定义每个可能的组合。

示例:将 Pair Substr 与 &str 和 CowStr 及其反转形式配对。

product! {
    $[
        $(Lhs: (SubStr)(&str)(SubStr)(CowStr))
        $(Rhs: (&str)(SubStr)(CowStr)(SubStr))

        impl PartialOrd<$Rhs> for $Lhs {
            fn partial_cmp(&self, other: &$Rhs) -> Option<std::cmp::Ordering> {
                (**self).partial_cmp(other)
            }
        }
    ]
}

依赖关系

~60KB