継続に無理やり名前をつけてみた
どうやらletという関数を使うと、ローカルな名前付の関数を作れるらしい。
ということで、簡単なfact/cpsでやってみる。
(define fact/cps (lambda (n cont) (if (= n 0) (cont 1) (fact/cps (- n 1) (lambda (m) (cont (* m n)))))))
で、else以下で作ってる新しい継続にletで名前を付けてみた。
(define fact/cps-with-let (lambda (n cont) (if (= n 0) (cont 1) (let ((newcont (lambda (m) (cont (* m n))))) (fact/cps-with-let (- n 1) newcont)))))
たぶん、Schemerの方々から見たら、すごく無駄なことしてんだろうな。
まぁ、自分もこの先やるつもりはないけど。