2009-11-30 17 views
5

En raison de an article in IBM Developer Works about CPS (continuation passing style), j'essaie de ne pas utiliser "return".Implémentation JavaScript CPS (continuation passing style)

sans CPS

function getter() { 
    * calculate a* 
    return a; 
} 
function test() { 
    *part 1* 
    if(*condition*) { 
     a = getter(); 
    } 
    *use a* 
    *part 2* 
} 

transition

le reste de la fonction

} 
    *use a* 
    *part 2* 

avec CPS

function getter() { 
    * calculate a* 
    continuationtest(a); 
} 
function test() { 
    *part 1* 
    if (*condition*) { 
     getter(); 
} 
function continuationtest(a) { 
    } 
    *use a* 
    *part 2* 
} 

le problème

Une boucle se termine dans le reste de la fonction.

Quelle est la solution?

Répondre

0

Vous avez une faute de frappe:

function continuationtest(a) { 
    } 
    *use a* 
    *part 2* 
} 

Cela peut être ce que vous vouliez:

function continuationtest(a) { 
    *use a* 
    *part 2* 
} 

Autre que cela, il sera difficile d'aider avec si peu d'informations, comme ce qui se passera dans le continuationtest, car cela pourrait être critique si vous avez encore des problèmes.

6

Le style de continuation-passing ne se mélange pas bien avec les boucles JavaScript. Vous devez trouver un autre moyen de faire la boucle.

Notez que votre code est interprété comme ceci:

function test() { 
    *part 1* 
    if (*condition*) { 
     getter(); 
    }        // <--- note indentation here 
    function continuationtest(a) { // <--- and here 
    } 
    *use a* 
    *part 2* 
} 

Vous n'êtes pas en utilisant le style passage de continuation du tout. Lorsque getter() appelle continuationtest(), il échoue probablement, puisque continuationtest() n'est pas dans la portée là.

Un exemple CPS avec une boucle peut ressembler à ceci.

Sans CPS

function doSomething(i) { 
    alert("doing " + i); 
} 

function doLoop() { 
    for (i = 0; i < 9; i++) 
     doSomething(i); 
} 

Avec CPS

function doSomething(i, ctn) { 
    alert("doing " + i); 
    ctn(); 
} 

function doLoop() { 
    doLoopStartingAt(0); 

    function doLoopStartingAt(i) { 
     if (i < 9) 
      doSomething(i, function ctn() { doLoopStartingAt(i + 1); }); 
    } 
} 

(L'avantage de CPS est que, à tout moment, vous pouvez utiliser setTimeout() pour retarder l'exécution du reste, ou attendre l'entrée de l'utilisateur à traiter, ou évitez que le navigateur affiche une fenêtre contextuelle "script lent".)