#:g1: CADRでSICP 1.6

Posted 2007-04-26 12:37:00 GMT

CADRでSICP Exercise 1.6.に挑戦 - Structure and Interpretation of Computer Programs

Exercise 1.6
ifが特殊形式である必要性について

(defun new-if (predicate then-clause else-clause) (cond (predicate then-clause) (T else-clause))) のように新しいifを定義する。 これが、 (defun sqrt-iter (guess x) (new-if (good-enough-p guess x) guess (sqrt-iter (improve guess x) x))) のように使われた場合、どのように動くかを考察せよ、 というような問題。


解答
特殊形式でないと、then部、else部ともに評価を終えた
後で、分岐を評価しようとするので、自分を呼び出す再
帰が使われている場合、無限ループになってしまう。
そして全然質問とは関係ないが、ずっと解答と書いてい
たつもりが、回答となっていたことにはたと気付いたの
で全部直した。

自分のための理解補助コード: (defun foo (x) (if (zerop x) 'zero! (princ "foo!")))

(foo 0) -> ZERO!

(defun bar (x) (new-if (zerop x) 'zero! (princ "foo!")))

(bar 0) ->ZERO! と共にfoo!もプリントされる。

comments powered by Disqus