(apply-generic op . args)

教育者, 将軍, 栄養士, 心理学者, 親はプログラムする. 軍隊, 学生, 一部の社会はプログラムされる. - 計算機プログラムの構造と解釈 序文

計算機プログラムの構造と解釈(SICP) 勉強メモ5

2週間ほど急がしくて勉強が出来なかった。
今日から再開。
とりあえず、前回勉強した分をUPしてなかったのでUP.
問題1.6だけ。
問題1.7で悩んでる。

;問題1.6
(define (new-if predicate then-clause else-clause)
  (cond (predicate then-clause)
        (else else-clause)))

;(define (sqrt-iter guess x)
;  (new-if (good-enough? guess x)
;          guess
;          (sqrt-iter (improve guess x)
;                     x)))

;上のsqrt-iterを実行したら、無限ループに陥った。
;ifとは
; (if <predicate> <consequent> <alternative>)
;である。
;if式の評価はまず式の述語<predicate>部分を評価する。
;<predicate>の評価の結果が真なら、解釈系は帰結部<consequent>を"評価しその値を返す"。
;
;一方、condは
; (cond (<p1> <e1>)
;       (<p2> <e2>)
;       (<pn> <en>))
;である。
;condはまず<p1>を評価し、その値が偽なら<p2>を評価する。
;その手順が真である述語が見つかったら、解釈駅はその節の対応する<e>の値をこの条件式の値として返す。
;
;つまり、new-ifではelse-clauseの値が評価されず、else-clauseがそのまま返り値として返ってきている。
;よって無限ループとなる。
;
;ifを使ったsqrt-iter
;gosh> (trace sqrt-iter)
;#<closure #f>
;gosh> (sqrt 9)
;0:(sqrt-iter 1.0 9)
;1:  (sqrt-iter 5.0 9)
;2:    (sqrt-iter 3.4 9)
;3:      (sqrt-iter 3.023529411764706 9)
;4:        (sqrt-iter 3.00009155413138 9)
;          ->3.00009155413138
;        ->3.00009155413138
;      ->3.00009155413138
;    ->3.00009155413138
;  ->3.00009155413138
;trace: sqrt-iter has been called 5 times.
;3.00009155413138
;
;new-ifを使ったsqrt-iter
;(sqrt-iter (improve guess x) x)
;  At line 448 of "/users/nishizawaiori/Study/book/lisp/sicp/sicp.scm
;この無限ループ
;
;これにより、(improve guess x)が評価されず、平均値が変わらずずっとgood-enough?で#fが返り、無限ループに陥ることが解る。
;