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 方面でミランのカカ呼ばわりなんですが、どーゆー意味なんだろ。ボケた情報たれ流しで困ったもんだ、とゆー意味なら遠慮なくツッコんで頂ければナニなんですが、それ以前の問題なのかも、と思うとさぶい。

さらに追記

これ、駄目ぢゃん。全然繰り返しとゆーナニを意識していない。疲れてるな。