递归:快速入门

主要观点:

  • 传统低级语言如 C 中迭代需手动编写,新语言如 Rust 提供迭代器抽象。
  • recursion crate 为递归数据结构做类似之事,本文介绍其新版本。
  • 以文件匹配工具为例,传统find工具表达复杂查询复杂,detect工具使用表达式语言更便捷。
  • detect分阶段运行匹配准则,先文件名后元数据再文件内容,可短路节省资源。
  • detect的表达式语言结构在各阶段相同,通过reduce_and_short_circuit函数缩小可用谓词集。
  • 传统写reduce_and_short_circuit函数难读易导致栈溢出,使用recursion crate 可简化且不使用栈。
  • 通过定义ExprFrame和实现MappableFrameCollapsible trait 可写递归算法。
  • recursion crate 适合处理递归数据结构,可用于实现懒求值表达式语言等。
  • detectcrates.io上,支持多谓词阶段和多阶段评估。
  • 文中所有 GIF 由collapse_frames的特殊版本生成。

关键信息:

  • find工具表达复杂文件匹配查询复杂。
  • detect工具使用表达式语言'filename(detect) && executable() || filename(.rs) && contains(map_frame)'
  • 表达式语言结构在各阶段相同,通过reduce_and_short_circuit函数处理。
  • recursion crate 简化reduce_and_short_circuit函数且不使用栈。
  • 通过定义ExprFrame和实现 trait 可写递归算法。
  • detectcrates.io上,支持多阶段评估。

重要细节:

  • Predicate枚举用于表示不同阶段的谓词,通过消除类型参数标记评估阶段。
  • Expr枚举表示表达式语言结构,不同阶段谓词类型不同。
  • reduce_and_short_circuit函数通过消除谓词和短路来处理表达式。
  • ExprFrameExpr的变体,用于表示递归算法中的栈帧。
  • MappableFrameCollapsible trait 用于处理ExprFrame
  • eval函数通过collapse_frames评估Expr
  • detect工具支持多谓词阶段和多阶段评估,可最小化系统调用。
  • 文中 GIF 由特殊版本的collapse_frames自动生成。
阅读 21
0 条评论