#generator #iterator

nightly propane

一个生成器语法实验

1 个不稳定版本

0.1.0 2020 年 8 月 6 日

#5#iterators

MIT/Apache

8KB

propane - Rust 生成器

Propane 是不稳定生成器功能的一个薄包装,允许用户创建自由函数作为生成器。它实现了一种关于生成器应该如何设计的特定想法;生成器至今仍然不稳定的一个很大原因就是这些设计问题尚未解决。

语法看起来像这样

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

因为它是一个宏,所以它的性能不如原生语言功能,并且错误信息也更差。

设计决策

Propane 被设计为允许用户编写用于实现迭代器的生成器。因此,其生成器在某些重要方面受到限制。这些是 Propane 的故意设计限制(即,这些限制不是由于错误,它们不是有意要取消的)

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

关于 Unpin 要求的说明

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

然而,通常情况下,用户可以将未拥有数据推送到迭代器外部,而在未来中则不能这样做。未来通常最终必须是 'static,这样它们就可以被启动,但迭代器通常是以不需要它们拥有所有数据的方式被消费的。

因此,可能的情况是,仅限于不包含自引用的生成器对于这种用例就足够了。Propane 打算探索这种可能性。

依赖项

~1.5MB
~35K SLoC