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))