SICP読書会お休みの回(in 渋谷)

  • 会場が確保できなかったのでnaoya_tさんの迎撃会に
  • でも東京からの参加は二人(泣)
    • 時間設定にちょっと無理があった
  • SchemerはLisperではない
  • 再帰はがしがxyzzy界隈で話題に
  • OCamlはふつうっぽい
  • naoya_tさんのご希望で喫茶店に
  • 横で二人が濃い話をしてるのをぼーっと聞いておりました
  • 結局、アドバンストSICP読書会になっちゃうし。SICPを持ってきてなかったのは私だけ
  • 問題の答えは紙に書く。実行するのは軟弱
    • 書いたコードが実行できる黒板とか
  • naoya_tさんはSICPを読み終えて最後の問題をやってる
  • Objective-C/CocoaでSchemeを実装してるとのこと
    • オブジェクトでcall/ccを実装するのは無理っぽい
  • SICPだけで作れるのは言語処理系くらい
  • Gaucheが実用的なのはCommon Lispの考え方を取り入れているから
  • 名前付きletの環境をどう実装するかがメインの話題に

以下、復習

(define (fib n)
  (let fib-iter ((a 1)
                 (b 0)
                 (count n))
    (if (= count 0)
        b
        (fib-iter (+ a b) a (- count 1)))))

↑これを
こうする↓

(define (fib n)
  (let ((fib-iter '*unassigned*))
    (set! fib-iter
          (lambda (a b count)
            (if (= count 0)
                b
                (fib-iter (+ a b) a (- count 1)))))
    (fib-iter 1 0 n)))

追記
shiroさんのご指摘により修正
R5RSによると↓みたいです

(define (fib n)
  ((letrec ((fib-iter (lambda (a b count)
                        (if (= count 0)
                            b
                            (fib-iter (+ a b) a (- count 1))))))
     fib-iter)
   1 0 n))

↓でも動作おk

(define (fib fib-iter)
  ((letrec ((fib-iter (lambda (a b count)
                        (if (= count 0)
                            b
                            (fib-iter (+ a b) a (- count 1))))))
     fib-iter)
   1 0 fib-iter))