¿Qué debería pasar cuando se asigna una función de generador? [cerrado]
Pregunta
Si tengo un lenguaje de programación con funciones de primera clase. ¿Qué debe ser la semántica cuando se comparte una función de generador?
Por ejemplo:
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(); // ??
Puedo imaginar tres cosas:
- c == 2, d == 3 lo que significa que la función del generador está compartida
- c == 0, d == 2 significa que se crea una nueva función de generador, con los valores inicializados
- c == 2, d == 2 significa que se crea una nueva función de generador copiando el estado actual del generador
La mejor respuesta, en mi opinión, proporcionaría el argumento más convincente para hacer un mecanismo u otro. A menudo me parece que el estado de la técnica es el argumento más persuasivo.
Solución
Si tiene una semántica de referencia en su idioma y la asignación es generalmente una asignación de referencia, entonces quiere la opción 1.
Esto es lo que sucede en Python, donde genera son objetos, y la asignación es asignación de referencia (incluso si invoca .next () para recuperar el siguiente valor, en lugar de que " llamando " el generador).
Aquí hay una breve demostración de cómo se comporta esto en 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)