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(); // ??

私は3つのことを想像することができます:

  1. c == 2、d == 3は、ジェネレーター関数が共有されていることを意味します
  2. c == 0、d == 2は、値が初期化された新しいジェネレーター関数が作成されることを意味します
  3. c == 2、d == 2は、ジェネレーターの現在の状態をコピーすることにより、新しいジェネレーター関数が作成されることを意味します

私の意見では、最良の答えは、あるメカニズムまたは別のメカニズムを実行するための最も説得力のある議論を提供するでしょう。多くの場合、先行技術が最も説得力のある議論であることがわかります。

4

1 に答える 1

2

言語に参照セマンティクスがあり、割り当てが通常参照割り当てである場合は、オプション1が必要です。

これはPythonで行われることであり、generatesオブジェクトであり、代入参照代入です(.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 に答える