名前付きlet、ふたたび。

名前付きletがなかなか腑に落ちないので、名前付きlet使って階乗計算(ローカル手続きで末尾再帰)やってみた。

gosh> (use srfi-1)
#<undef>
gosh> (define fact-named-let
        (lambda (n)
          (let f ((m n)
                  (cont (lambda (_) _)))
            (if (= m 0)
                (cont 1)
                (f (- m 1) (lambda (x) (cont (* m x))))))))
fact-named-let
gosh> (map fact-named-let (iota 10 1))
(1 2 6 24 120 720 5040 40320 362880 3628800)

よかろうもん。


mとcontが常にnと(lambda (_) _)になるような気がして

((m n)
 (cont (lambda (_) _)))

を書くときに不安になったりならなかったり。