您如何以您最喜欢的语言模拟 Python 样式生成器?我找到了 this一个在方案中。看到其他实现一定很有趣,尤其是在那些没有一流延续的语言中。
最佳答案
我根本不会在 Lisp/Scheme 中使用 yield。
'yield' 需要语言中的某种协同程序或延续设施。可以通过更简单的函数方式实现 yield 的许多用途。
YIELD 基本上与著名的 COME-FROM 运算符有关。 ;-) 在这里,某个地方的调用可能会导致某个其他例程中的不同地方,具体取决于其执行上下文。所以一个例程突然有多个入口点,它们的顺序是在运行时确定的。对于简单的用途,这可能很好,但我认为对于更复杂的代码,关于代码的推理会变得更加困难。
以问题中链接的 Scheme 示例为例:
(define/y (step)
(yield 1)
(yield 2)
(yield 3)
'finished)
(list (step) (step) (step))
多次调用(step)然后返回不同的值。
我只想创建一个闭包:
(define step
(let ((state '(1 2 3 finished)))
(lambda ()
(pop state))))
这将带有 yield 的函数分成两个不同的东西:一个携带状态的变量和一个改变状态的简单函数。状态不再隐式编码到执行序列中。
(list (step) (step) (step))))
可以想象类似的解决方案可以用于 yield 的其他用途。
将其与 generators from the Common Lisp SERIES library 进行比较:
(let ((x (generator (scan '(1 2 3 finished)))))
(list (next-in x)
(next-in x)
(next-in x)))
如果我们从另一个答案来看这个 Python 示例
def simpleRange(n):
for i in xrange(n):
yield i
for n in simpleRange(5):
print(n)
我们可以看到它复制了控制结构。调用位置和生成器都使用 FOR 迭代控制结构。使用闭包,我们可以摆脱对生成器内部控制结构的使用,只提供状态转换代码。
关于c++ - 各种语言的 Python 生成器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1451304/