|
|
1
5
生成器基本上是半协同的,有一些恼人的限制。因此,很明显,您可以使用半协程(当然还有完全协程)来实现它们。 如果没有协程,则可以使用任何其他通用控制流构造。有很多控制流构造都是“通用的”,即 每一个 控制流构造(包括所有其他通用控制流构造),包括协程,因此生成器可以(或多或少)简单地转换为仅该通用构造。
其中最著名的可能是
几乎所有的CPU都支持
另一个众所周知的控制流原语是continuations。延续基本上是一种更结构化、更易管理、更不邪恶的形式
C有一种“蹩脚”的连续体形式(
其他
上面的控制流构造是例外。有一篇论文表明,异常可能比连续性更强大,从而使异常在本质上等同于连续性
不是通用的,但可能强大到足以实现生成器只是简单的尾部调用优化(不过,我可能错了。很不幸我没有证据。)我 可以将生成器转换为一组互尾递归函数。我知道状态机可以通过尾部调用来实现,所以我很确定生成器也可以,因为毕竟,C#将生成器实现为状态机(我认为这与懒惰的评估结合起来尤其有效。) 最后但并非最不重要的一点是,在具有具体化调用堆栈的语言中(例如,像大多数Smalltalks),您可以构建几乎任何类型的控制流构造(事实上,具体化的调用堆栈基本上是过程性的低级别,相当于函数性的高级延续。) 那么,什么 生成器的其他实现是什么样子的?
Lua本身没有生成器,但是它有完全不对称的协程。主要的C实现使用
Ruby本身也没有生成器,但是它有
|