Cosa dovrebbe succedere quando viene assegnata una funzione generatore? [chiuso]
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:
- c == 2, d == 3 significa che la funzione generatore è condivisa
- c == 0, d == 2 significa che viene creata una nuova funzione di generatore, con i valori inizializzati
- 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.
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)