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:

  1. c == 2, d == 3 lo que significa que la función del generador está compartida
  2. c == 0, d == 2 significa que se crea una nueva función de generador, con los valores inicializados
  3. 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.

¿Fue útil?

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)
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top