gaucheノート  名前付きlet(named let)

末尾再帰で階乗を計算する関数

gosh> (define (fact-tailrec n acc)
(if (= n 1) acc
    (fact-tailrec (- n 1) (* n acc))))
fact-tailrec
gosh> (fact-tailrec 5 1)
120



letを使用して局所的な関数を定義することができ、これで末尾再帰がかけるようです。letの後ろが関数名で、その後に定義する変数には初期値が設定できるようです。
参照したURL:
http://www.geocities.jp/m_hiroi/func/abcscm04.html


letを使用して関数を書いてみる

gosh> (define (fact n)
(let loop ((n n) (acc 1))
  (if (= n 1) acc
      (loop (- n 1) (* n acc))))
)
fact
gosh> (fact 5)
120
gosh> (fact 10)
3628800
gosh> (define (fact n)
(let iter ((n n) (acc 1))
  (if (= n 1) acc
      (iter (- n 1) (* n acc))))
)
fact
gosh> (fact 5)
120
gosh> (fact 10)
3628800

loopっていうあらかじめ用意されている関数があるのかと思っていましたが、letで定義していたんですね。