7

ウィキペディアは、「クロージャーと適切な末尾呼び出しをサポートする言語では、継続渡しスタイルでプログラムを記述し、call/cc を手動で実装することが可能です」と述べています。

たとえばjavascriptでこの関数をどのように実装しますか? javascript が tco を実行しないことはわかっていますが、スタック領域が不足しないことを前提としています。

4

3 に答える 3

3

JavaScript で call/cc の実装を書くことはできません:

JavaScript は「適切な末尾呼び出し」の要件を満たしていません (追加のスタック作成はありません)。ただし、 Jetty に見られるような、例外を使用した継続の形式は可能であると私は信じています。「CPS」は関数オブジェクトを渡すのと同じくらい簡単ですが、時々バックアウトしない限り、最終的にはスタックの問題にも遭遇します。

ハッピーコーディング。

于 2011-11-26T23:58:52.310 に答える
1

はい、可能です。この質問を参照してください。これを実装する方法は次のとおりです。

Function.prototype.async = async;

function async() {
    setTimeout.bind(null, this, 0).apply(null, arguments);
}

function callcc(f, cc) {
    f.async(cc);
}

次に、次のように使用できます。

pythagoras.async(3, 4, alert);

function pythagoras(x, y, cont) {
    callcc.async(square.bind(null, x), function cc(x_squared) {
        callcc.async(square.bind(null, y), function cc(y_squared) {
            add.async(x_squared, y_squared, cont);
        });
    });
}

function square(x, cont) {
    multiply.async(x, x, cont);
}

function multiply(x, y, cont) {
    cont.async(x * y);
}

function add(x, y, cont) {
    cont.async(x + y);
}

ここでデモをいじることができます: http://jsfiddle.net/brZrd/

于 2012-12-24T09:29:24.667 に答える