開発環境
- OS X El Capitan - Apple (OS)
- Emacs (Text Editor)
- JavaScript (プログラミング言語)
- jQuery (Library)
- Node.js, Safari(Web browser)
CPS変換で調べたら自分のブログの雑なスライドが出てきて涙目になった
— κeen (@blackenedgold) 2016年5月12日
このスライドのことかなぁ(違うかも。。)とさらっと見てたら、階乗のとこが気になって実際に動かしてみたら(Scheme ではなくJavaScript のコード)、1だと1、1以上だと2になったから(callback には、引数をそのまま戻り値とする無名関数 function (x) { return x; }を指定)、JavaScript で継続渡しスタイルの階乗を求める関数を書いてみた。
コード(Emacs)
/*jslint browser : true, continue : true,
devel : true, indent : 4, maxerr : 50,
newcap : true, nomen : false, plusplus : false,
regexp : false, sloppy : true, vars : false,
white : false
*/
/*global $*/
var fact,
factCont1,
factCont2,
leCont,
mulCont,
subCont,
n,
print,
result = '',
$result = $('#result0');
fact = function (n) {
if (n <= 1) {
return 1;
}
return n * fact(n - 1);
};
result += fact(10) + '<br>';
// 一部をCPS 変換
factCont1 = function (n, cont) {
if (n <= 1) {
return cont(1);
}
return factCont1(n - 1, function (x) {
return cont(n * x);
});
};
result += factCont1(10, function (x) { return x; });
// 全てCPS変換(return文無し)
leCont = function (x, y, cont) {
cont(x <= y);
};
mulCont = function (x, y, cont) {
cont(x * y);
};
subCont = function (x, y, cont) {
cont(x - y);
};
factCont2 = function (n, cont) {
leCont(n, 1,
function (x) {
if (x) {
cont(1);
} else {
subCont(n, 1, function (x) {
factCont2(x, function (x) {
mulCont(x, n, cont);
});
});
}
});
};
factCont2(10, function (x) {
$result.html('');
result += '<br>' + x;
$result.html(result);
});
0 コメント:
コメントを投稿