#generator #proc-macro #propane

propane-macros

propane crate 的过程宏

1 个不稳定版本

0.1.0 2020 年 8 月 6 日

#1067 in #generator


propane 中使用

MIT/Apache

8KB
136

propane - Rust 生成器

Propane 是对不稳定生成器功能的薄包装,允许用户创建作为生成器的自由函数。它实现了一种特定的生成器设计理念;生成器至今仍不稳定的一个大原因是这些设计问题尚未确定。

语法如下

#[propane::generator]
fn foo() -> i32 {
    for n in 0i32..10 {
        yield n;
    }
}

由于它是一个宏,所以它不如原生的语言功能表现得那么好,并且错误信息更差。

设计决策

Propane 设计用于允许用户编写迭代器实现的生成器。因此,其生成器在某种程度上受到限制。这些都是 propane 的有意设计限制(即,这些不是由于错误而导致的限制,它们不是有意要取消的)

  1. A propane 生成器成为一个返回 impl Iterator 的函数;迭代器接口是用户可以与生成器返回类型一起使用的唯一接口。
  2. A propane 生成器只能返回 (),它不能先返回一个类型,然后返回另一个有趣类型。The ? 操作符返回错误,然后在下一次恢复时返回。
  3. A propane 生成器实现了 Unpin,并且不能是自引用的(与异步函数不同)。

关于 Unpin 要求的说明

由于 Iterator::next 的签名,在调用 next 之间移动迭代器总是安全的。这使得未装箱、自引用的迭代器不安全。在我们设计迭代器 API 的时候,我们没有 Pin

然而,一般来说,用户可以以他们无法与 futures 一样的方式将未拥有的数据推到迭代器之外。通常,futures 最终必须 'static,因此可以启动,但迭代器通常以不需要拥有所有数据的方式被消耗。

因此,可能的情况是,限制生成器不包含自引用的生成器对于这种用途来说是足够的。Propane 意图探索这种可能性。

依赖关系

~1.5MB
~35K SLoC