#递归 #闭包 # #不动点 #y-组合子

fix_fn

用于创建递归闭包的宏(类似于 Y 组合子)

4 个版本 (稳定)

1.0.2 2020 年 5 月 31 日
0.1.0 2020 年 5 月 31 日

#2196Rust 模式

每月 38 次下载
forward_goto 中使用

MIT 许可证

8KB
97

Build Creates.io Docs

fix_fn

此库通过提供一个宏 fix_fn 来启用递归闭包的创建。其功能类似于 Y 组合子。递归闭包可以有任意数量的参数,并且可以捕获变量。

use fix_fn::fix_fn;
let fib = fix_fn!(|fib, i: u32| -> u32 {
    if i <= 1 {
           i
    } else {
        // fib will call the closure recursively
        fib(i - 1) + fib(i - 2)
    }
});

assert_eq!(fib(7), 13);

lib.rs:

此库通过提供一个宏 fix_fn 来启用递归闭包的创建。其功能类似于 Y 组合子。递归闭包可以有任意数量的参数,并且可以捕获变量。

use fix_fn::fix_fn;

let fib = fix_fn!(|fib, i: u32| -> u32 {
    if i <= 1 {
           i
     } else {
         // fib will call the closure recursively
         fib(i - 1) + fib(i - 2)
     }
 });

assert_eq!(fib(7), 13);

生成的代码并非完全抽象,因为它使用一个 dyn 特性(没有任何装箱)来克服 Rust 的递归类型限制。然而,在大多数情况下,优化器应该能够消除任何动态分发。

遗憾的是,不支持可变递归闭包。

无运行时依赖