O que deve acontecer quando uma função de gerador é atribuído? [fechadas]
Pergunta
Se eu tiver uma linguagem de programação com funções de primeira classe. O que deve a semântica ser quando uma função de gerador é compartilhada?
Por exemplo:
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(); // ??
Eu posso imaginar três coisas:
- c == 2, 3 d == sentido de que o funcionamento do gerador é compartilhada
- c == 0, d == 2 sentido de que uma nova função gerador é criada, com os valores inicializado
- c == 2, d == 2 sentido de que uma nova função gerador é criado copiando o estado atual do gerador
A melhor resposta na minha opinião, seria fornecer o argumento mais convincente para fazer um mecanismo ou outro. Muitas vezes eu acho que a arte antes é o argumento mais persuasivo.
Solução
Se você tem semântica de referência em seu idioma, e atribuição é normalmente atribuição de referência, então você quer a opção 1.
Isto é o que acontece em Python, onde gera são objetos e atribuição é atribuição de referência (mesmo que você invocar .next () para recuperar o próximo valor, em vez do que "chamar" o gerador).
Aqui está uma breve demonstração de como este se comporta em 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)