名前付きlet

名前付きletなコードを見たけど、全然意味不明だったので、10から0まで足してみる。

名前付きlet

(define (sum n)
  (let iter ((i n) (s 0))
    (if (= i 0)
        s
        (iter (- i 1) (+ i s)))))

(sum 10) ; 55

どうやら、反復の簡易記法として使えるみたい。宣言部は、初期化するだけ。うぅん。わかりにくい。


ついでに、反復いろいろ。

do

ACL見て使える!!と思ってみたり。

(define (sum n)
  (do
    ((i n (- i 1))
     (s 0 (+ s i)))
    ((= i 0) s)))

(sum 10) ; 55

最短。doの方がちょっとわかりやすい。

letrec

letrec法

(define (sum n)
  (letrec
    ((iter (lambda (i s)
             (if (= i 0)
                 s
                 (iter (- i 1) (+ i s))))))
     (iter n 0)))

(sum 10) ; 55

最近letrec使ってるな。激しくなんとなくなんだけど。

define

無難にdefine

(define (sum n)
  (define (iter i s)
    (if (= i 0)
        s
        (iter (- i 1) (+ i s))))
  (iter n 0))

(sum 10) ; 55

無難だ。

まとめ

  • 名前付きletはわかりにくい!!
  • 反復な場合、引数が一個増えるってのが問題なんだよね。

どれがいいかな・・・そういえばsrfi-42もあるな。