• [^] # Re: Chouette

    Posté par (site web personnel) . En réponse à la dépêche ECMAScript 2015 est approuvé. Évalué à 2.

    Pour donner un exemple concret de définition d'un objet itérable au moyen d'un forEach j'ai défini un objet primes qui énumère les nombres premiers (SpiderMonkey / js) – de la façon la plus naïve possible:

    var createPrimes = function(spec, _my) {
     var that = {};
     var my = _my || {};
     my.knownPrimes = [ 2 ];
     my.upperBound = 2;
     var isDivisible = function(n) {
     return my.knownPrimes.some(function(k) {
     return (n % k) === 0;
     });
     };
     var findPrimesUpTo = function(n) {
     for(var i = my.upperBound; i <=n; ++i) {
     if(! isDivisible(i)) {
     my.knownPrimes.push(i);
     }
     }
     my.upperBound = n;
     }
     var isPrime = function(n) {
     findPrimesUpTo(n);
     return my.knownPrimes.some(function(k) {
     return k === n;
     });
     }
     that.forEach = function(callback) {
     var i = 2;
     while(true) {
     if(isPrime(i)) {
     callback(i);
     };
     ++ i
     };
     };
     return that;
    };
    var primes = createPrimes();
    primes.forEach(print);
    

    Cela ne s'arrête jamais, mais si le code utilisant l'énumération en a marre, il peut lancer une exception par exemple. On peut partager le même énumérateur entre plusieurs threads dans node.js par exemple. Qu'est-ce qu'apporte une réécriture avec yield dans cet exemple? Et dans d'autres exemples?