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:

  1. c == 2, 3 d == sentido de que o funcionamento do gerador é compartilhada
  2. c == 0, d == 2 sentido de que uma nova função gerador é criada, com os valores inicializado
  3. 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.

Foi útil?

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)
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top