SICP 読み (174) 4.1.6 内部定義
問題 4.20 は a のみ、とゆー事で。先に試験を一つだけ作成。
("4.20" ("example" (let ((l '(letrec ((fact (lambda (n) (if (= n 1) 1 (+ n (fact (- n 1))))))) (fact 10))) (r '(let ((fact '*unassigned*)) (set! fact '(lambda (n) (if (= n 1) 1 (+ n (fact (- n 1)))))) (fact 10)))) (assert-equal r (letrec->let l)) ) ) )
一応両方とも gosh で動作を確認。
gosh> (letrec ((fact (lambda (n) (if (= n 1) 1 (+ n (fact (- n 1))))))) (fact 10)) 55 gosh> (let ((fact '*unassigned*)) (set! fact (lambda (n) (if (= n 1) 1 (+ n (fact (- n 1)))))) (fact 10)) 55 gosh>
で、実装が以下なんですが、微妙。
(define (letrec->let exp) (list 'let (list (list (caaadr exp) ''*unassigned*)) (list 'set! (caaadr exp) (car (cdaadr exp))) (caddr exp)))
もう caaadr だの cdaadr だのってワケ分かって使ってなかったりします。(を
追記
mixi 方面でミランのカカ呼ばわりなんですが、どーゆー意味なんだろ。ボケた情報たれ流しで困ったもんだ、とゆー意味なら遠慮なくツッコんで頂ければナニなんですが、それ以前の問題なのかも、と思うとさぶい。
さらに追記
これ、駄目ぢゃん。全然繰り返しとゆーナニを意識していない。疲れてるな。