c++ - 各种语言的 Python 生成器

标签 c++ python programming-languages lisp

您如何以您最喜欢的语言模拟 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/

相关文章:

java - 用于从 xsd 生成 C++ 类的 JAXB 等价物?

c++ - 调用模板参数 constexpr 方法?

oop - 为什么 Smalltalk 支持一流的功能,而不支持其他功能特性?

unsigned char 和带乘法的 char 之间的 C++ 区别

python - TensorFlow 中的矩阵逆

python - 使用pytest测试文件读取功能时出错

python sklearn获取模型的可用超参数列表

java - 注释是否会使运行程序变慢?

vba - VB : What is missing in scripting host while it is present in "full" VB?

c++ - Xcode C++ 独立文件未编译