Was soll passieren, wenn eine Generatorfunktion zugeordnet ist? [geschlossen]
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:
- == c 2, d == 3 bedeutet, daß die Generatorfunktion freigegeben ist
- c == 0, d == 2 bedeutet, dass eine neue Generatorfunktion erzeugt wird, mit den Werten initialisiert
- 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.
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)