継続渡しスタイルのfact

関数プログラミングの勉強 http://p0t.jp/mt/archives/2007/01/post_545.html
を見て、ふと思いたって考えてみた。


継続(continuation)って未だによくわかってないんだけど、このへんを読んだ。


SchemeとActor理論 http://www.ice.nuie.nagoya-u.ac.jp/~h003149b/lang/actor/actor.html
なんでも継続 http://www.shiro.dreamhost.com/scheme/docs/cont-j.html
継続渡しによるWebアプリケーション http://www.kahua.org/kahua/docserv/seminar200402/cps/index.html
なんでも継続、ActionScript で。http://torus.jp/memo/x200403/nandemo_keizoku_as.rd.html


むずしい。むずかしすぎる。
考えてるとすぐわけわかんなくなってくる。
そもそもSchemeが分かってないし。


で、factを継続渡しスタイルで書くとたぶんこんなふう。

function factCPS(n, k) {
    if (n == 0) {
        return k(1)
    }
    else {
        return factCPS(n - 1, function(u) {return k(u * n)})
    }
}

console.logを直でfactCPSに渡すとエラーになったのでlogをつくった。

var log = function(x){console.log(x)}
for (var i = 0; i <= 10; i++) {
    factCPS(i, log)
}


「なんでも継続、ActionScript で。」のひとも書いているけれど、
returnを書くのが面倒くさい。一個、書き忘れて軽くはまった。
いちおう計算はできてるけど、これでいいのかな。