#generator #iterator #stream

nightly iterator_item

一个生成器语法实验

2个不稳定版本

0.2.0 2021年11月10日
0.1.0 2021年11月6日

#1853 in 算法

MIT/Apache

16KB
176

Rust迭代器项:语法探索

这个crate是对不稳定生成器特性的薄封装,允许用户创建新项作为生成器。它遵循Propane crate的一般语义,但我的兴趣是让感兴趣的人分叉它,并为这些项制定自己的语法。

以下语法受支持,需要被iterator_item宏的调用所包围

区分符:*

fn* foo() yields i32 {
    for n in 0i32..10 {
        yield n;
    }
}

区分符:!

gen fn foo() -> i32 {
    for n in 0i32..10 {
        yield n;
    }
}

因为它是一个宏,所以它不如本地语言特性那样有效,并且错误信息也更差,但已经做出了一些努力使其可用。

Propane的设计决策

因为语义严重依赖于Propane,以下考虑也适用于此crate。

Propane设计用于允许用户编写用于实现迭代器的生成器。因此,它的生成器在某种程度上受到限制。以下是Propane的有意设计限制(即,这些限制不是由于错误,它们不是打算解除的)

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

关于Unpin要求的说明

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

然而,通常,用户可以将无权数据推离迭代器,这是他们无法使用futures的方式。通常,futures最终必须是'static,因此可以启动,但迭代器通常以不需要它们拥有所有数据的方式被消耗。

因此,可能的情况是,仅限于不包含自引用的生成器对于这个用例来说是足够的。丙烷打算探索这个可能性。

依赖项

~2.5MB
~51K SLoC