ウィキペディアは、「クロージャーと適切な末尾呼び出しをサポートする言語では、継続渡しスタイルでプログラムを記述し、call/cc を手動で実装することが可能です」と述べています。
たとえばjavascriptでこの関数をどのように実装しますか? javascript が tco を実行しないことはわかっていますが、スタック領域が不足しないことを前提としています。
ウィキペディアは、「クロージャーと適切な末尾呼び出しをサポートする言語では、継続渡しスタイルでプログラムを記述し、call/cc を手動で実装することが可能です」と述べています。
たとえばjavascriptでこの関数をどのように実装しますか? javascript が tco を実行しないことはわかっていますが、スタック領域が不足しないことを前提としています。
JavaScript で call/cc の実装を書くことはできません:
JavaScript は「適切な末尾呼び出し」の要件を満たしていません (追加のスタック作成はありません)。ただし、 Jetty に見られるような、例外を使用した継続の形式は可能であると私は信じています。「CPS」は関数オブジェクトを渡すのと同じくらい簡単ですが、時々バックアウトしない限り、最終的にはスタックの問題にも遭遇します。
ハッピーコーディング。
はい、可能です。この質問を参照してください。これを実装する方法は次のとおりです。
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/