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 コメント:

コメントを投稿