#递归 # #未来 #助手 #迭代 #异步 #参考

unrecurse

将您的递归代码重写为迭代方式的辅助 crate

1 个不稳定版本

0.1.0 2022年4月6日

#2044 in 数据结构

MIT 许可证

55KB
664

Unrecurse

从您的 Rust 代码中去除递归。

许可证

MIT


lib.rs:

Unrecurse

此处于原型状态 根据作者所知,总体思路是可行的,甚至通过了 miri。但内部和公开 API 中仍有许多粗糙边缘。

将递归方法转换为迭代的辅助工具。

此 crate 包含以下主要部分。

  • RefStack 结构,用于直接和细粒度访问栈。但现在只支持引用。
  • [run] 能够存储引用栈中前一个元素的 struct。
  • run_async 重新编写异步递归,而不需要递归/宏/分配每个 future
  • run_async_backref 如果您的异步递归中当前栈帧包含对前一个栈帧的引用

最简单的方法是使用 run_async(_backref)。您可以将当前的递归函数转换为 async fn。添加 Recursion/RecursionContext 参数。使用它来调用递归,搞定。它仍然看起来像递归,因此仍然容易推理,但内部它使用异步机制来按顺序执行一切,使用为当前状态分配的专用栈。但当前 Rust 中的 futures 优化得并不是很好。所以如果生成的 future 过大,您可能需要求助于 run 函数,该函数允许您创建自己的状态以存储在内部栈中。

MSRV: 1.60

依赖关系

~1MB
~15K SLoC