継続に無理やり名前をつけてみた

どうやら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の方々から見たら、すごく無駄なことしてんだろうな。
まぁ、自分もこの先やるつもりはないけど。