Question

Si j’ai un langage de programmation avec des fonctions de première classe. Quelle devrait être la sémantique quand une fonction génératrice est partagée?

Par exemple:

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

Je peux imaginer trois choses:

  1. c == 2, d == 3 signifie que la fonction du générateur est partagée
  2. c == 0, d == 2, ce qui signifie qu'une nouvelle fonction de générateur est créée avec les valeurs initialisées
  3. c == 2, d == 2 ce qui signifie qu'une nouvelle fonction de générateur est créée en copiant l'état actuel du générateur

La meilleure réponse, à mon avis, fournirait l’argument le plus convaincant pour mettre en œuvre un mécanisme ou un autre. Je trouve souvent que l’état de la technique est l’argument le plus convaincant.

Était-ce utile?

La solution

Si vous avez une sémantique de référence dans votre langue et que l'affectation est généralement une assignation de référence, vous souhaitez utiliser l'option 1.

C’est ce qui se passe en Python, où génère des objets et où est une assignation de référence (même si vous appelez .next () pour récupérer la valeur suivante, plutôt que "appelant" le générateur).

Voici une brève démonstration de son comportement 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)
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top