#curry #haskell #currying #functional #macro

macro cutlass

基于宏的库,用于从配置处理中去除样板代码

1个不稳定版本

0.1.0 2020年5月5日

#1390过程宏

MIT 许可证

6KB
82 代码行

cutlass

为Rust函数提供实验性自动柯里化

示例

此功能目前仅在nightly版本中启用type_alias_impl_trait功能时才有效。

#![feature(type_alias_impl_trait)]

#[cutlass::curry]
fn add(x: u32, y: u32, z: u32) -> u32 {
    return x + y + z;
}

fn main() {
    let plus_3 = add(1)(2);
    let v: Vec<u32> = (1..=3).map(plus_3).collect();
    assert_eq!(v, vec![4, 5, 6]);
}

工作原理

以下代码中的#[curry]过程宏将上述add函数扩展为类似以下内容(大致)

type T0 = u32;
type T1 = impl Fn(u32) -> T0;
type T2 = impl Fn(u32) -> T1;
fn add(x: u32) -> T2 {
    return (move |y| move |z| x + y + z);
}

注意事项

  • 目前不支持方法函数(带有self签名的函数)
  • 函数必须有一个返回值
  • 仅在nightly版本中启用type_alias_impl_trait时才有效

测试

使用cargo +nightly test测试此crate。

要查看宏展开,安装cargo-expand并运行cargo expand --test <test name>. 以expand tests/smoke.rs为例

cargo expand --test smoke

依赖

~1.5MB
~35K SLoC