Hatena::Groupcadr

わだばLisperになる このページをアンテナに追加 RSSフィード

2004 | 12 |
2005 | 01 | 02 | 07 | 10 | 11 |
2006 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2007 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2008 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2009 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2010 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2011 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 11 |

2007-04-26

CADRでSICP 1.6

| 21:37 | CADRでSICP 1.6 - わだばLisperになる を含むブックマーク はてなブックマーク - CADRでSICP 1.6 - わだばLisperになる

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!もプリントされる。