0

如果我有一种具有一流功能的编程语言。共享生成器函数时的语义应该是什么?

例如:

var f = function() { 
  foreach (i in 0..42)
     yield i;
}

int a = f(); // 0
int b = f(); // 1

// Assigning the generator function 
var g = f;

int c = g(); // ??
int d = f(); // ??

我可以想象三件事:

  1. c == 2, d == 3 表示生成器函数是共享的
  2. c == 0, d == 2 表示创建了一个新的生成器函数,其值已初始化
  3. c == 2, d == 2 表示通过复制生成器的当前状态来创建一个新的生成器函数

在我看来,最好的答案将提供最有说服力的论据来做一种或另一种机制。我经常发现现有技术是最有说服力的论据。

4

1 回答 1

2

如果您的语言中有引用语义,并且分配通常是引用分配,那么您需要选项 1。

这就是在 Python 中发生的情况,其中 generate对象,赋值引用赋值(即使您调用 .next() 来检索下一个值,而不是“调用”生成器)。

这是一个简短的演示,它在 Python 中的行为方式:

>>> def gen():
...   for i in range(42):
...     yield i
... 
>>> f = gen().next
>>> a = f()
>>> b = f()
>>> g = f
>>> c = g()
>>> d = f()
>>> a, b, c, d
(0, 1, 2, 3)
于 2009-10-24T19:28:24.753 回答