0

Si j'ai un langage de programmation avec des fonctions de première classe. Quelle devrait être la sémantique quand une fonction de générateur est partagée?Que devrait-il se passer lorsqu'une fonction de générateur est assigné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 sens que la fonction génératrice est partagée
  2. c == 0, d == 2 signifiant qu'une nouvelle fonction de générateur est créée, avec les valeurs initialisées
  3. c == 2, d == 2 signifiant 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 faire un mécanisme ou un autre. Souvent, je trouve que l'art antérieur est l'argument le plus convaincant.

+2

Et pour les points bonus, ce sur différents sujets? – leppie

+0

Différents threads est un problème indépendant. Cela se produit même si vous n'attribuez pas de générateurs (en supposant que les threads puissent accéder aux mêmes variables). –

Répondre

2

Si vous avez la sémantique de référence dans votre langue, et l'affectation est fait référence généralement l'affectation, alors vous voulez l'option 1.

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

Voici une brève démonstration comment cela se comporte 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) 
+0

Si l'édition pour inclure un gros bloc de code est trop, je suis désolé! Je voulais l'ajouter et je me suis senti que c'était trop peu pour une réponse de son propre chef. – u0b34a0f6ae

+0

Le code me semble correct, donc l'édition est correcte (bien que je trouve que le réglage de f à la méthode suivante liée est trop mignon, je préfère partager le générateur, pas la méthode liée). –