2009-11-30 4 views
5

an article in IBM Developer Works about CPS (continuation passing style)のため、私は "返品"を使用しないようにしています。Javascript CPS(継続渡しスタイル)実装

CPSせず

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

遷移

関数の残り

} 
    *use a* 
    *part 2* 

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

問題

CPSと

ループは残りの関数で終了します。

解決策は何ですか。

答えて

0

あなたはタイプミスがあります

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

これは、あなたが何を望むかことがあります

それ以外
function continuationtest(a) { 
    *use a* 
    *part 2* 
} 

、とても少ない情報を支援するのは難しいだろう、など何が起こるかのようにcontinuationtestにあります。問題がまだ解決していない場合は、それが重要になる可能性があります。

6

継続渡しスタイルはJavaScriptループとうまく組み合わせません。ループを行う別の方法を見つける必要があります。あなたのコードは次のように解釈されている

注:

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

ですから、現在ではすべて継続渡しスタイルを使用していません。 getter()continuationtest()を呼び出すと、continuationtest()が範囲外にあるため、おそらく失敗している可能性があります。

ループを含むCPSの例は、次のようになります。 CPS 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); }); 
    } 
} 

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

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

なし

(CPSの利点は、任意の時点であなたは残りの部分の実行を遅らせるためにsetTimeout()を使用することができ、または待つということですユーザーの入力を処理するか、ブラウザに「スロースクリプト」ポップアップが表示されないようにしてください)

関連する問題