Domanda

Se ho un linguaggio di programmazione con funzioni di prima classe. Quale dovrebbe essere la semantica quando una funzione generatore è condivisa?

Ad esempio:

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

Posso immaginare tre cose:

  1. c == 2, d == 3 significa che la funzione generatore è condivisa
  2. c == 0, d == 2 significa che viene creata una nuova funzione di generatore, con i valori inizializzati
  3. c == 2, d == 2 significa che viene creata una nuova funzione del generatore copiando lo stato corrente del generatore

La migliore risposta secondo me, fornirebbe l'argomento più convincente per fare un meccanismo o un altro. Spesso trovo che l'arte nota sia l'argomento più persuasivo.

È stato utile?

Soluzione

Se hai una semantica di riferimento nella tua lingua e l'assegnazione è generalmente assegnazione di riferimento, allora vuoi l'opzione 1.

Questo è ciò che accade in Python, dove genera sono e l'assegnazione è assegnazione di riferimento (anche se si richiama .next () per recuperare il valore successivo, piuttosto di "quotare" il generatore).

Ecco una breve dimostrazione di come si comporta in 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)
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top