Frage

Wenn ich eine Programmiersprache mit First-Class-Funktionen haben. Was sollte die Semantik, wenn eine Generatorfunktion freigegeben ist?

Zum Beispiel:

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

Ich kann drei Dinge vorstellen:

  1. == c 2, d == 3 bedeutet, daß die Generatorfunktion freigegeben ist
  2. c == 0, d == 2 bedeutet, dass eine neue Generatorfunktion erzeugt wird, mit den Werten initialisiert
  3. c == 2, d == 2 bedeutet, dass eine neue Generatorfunktion durch Kopieren des aktuellen Zustands des Generators erzeugt wird,

Die beste Antwort meiner Meinung nach, würde das überzeugendste Argument einen Mechanismus oder eine andere zu tun. Oft finde ich, dass Stand der Technik das überzeugendste Argument ist.

War es hilfreich?

Lösung

Wenn Sie Referenzsemantik in Ihrer Sprache, und die Zuordnung ist in der Regel Zuordnung Referenz, dann wollen Sie die Option 1.

Dies ist, was in Python geschieht, wo erzeugt sind Objekte und Zuordnung ist Referenzzuordnung (auch wenn Sie .next () aufrufen, um den nächsten Wert abzurufen, eher als "Aufruf" des Generators).

Hier ist eine kurze Demonstration, wie dies in Python verhält:

>>> 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)
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top