rurururururumin’s diary

勉強の備忘録

SICP 1.6

問題 1.6

Alyssa P. Hackerはifが特殊形式である理由が分らない. 「cond を利用し, 普通の手続きとして定義してはいけないの?」と聞いた. Alyssaの友人のEva Lu Atorはそうすることはもちろん出来るといって, ifの新版を定義した:

(define (new-if predicate then-clause else-clause)
(cond (predicate then-clause)
(else else-clause)))
EvaはAlyssaにプログラムを見せた:
(new-if (= 2 3) 0 5)
5

(new-if (= 1 1) 0 5)
0
Alyssaは喜び, 平方根のプログラムを書き直すのにnew-ifを使った:
(define (sqrt-iter guess x)
(new-if (good-enough? guess x)
guess
(sqrt-iter (improve guess x)
x)))
Alyssaが平方根を計算するのにこれを使おうとすると, 何が起きるか, 説明せよ.

(define (new-if predicate then-clause else-clause)
(cond (predicate then-clause)
(else else-clause)))

(new-if (= 2 3) 0 5)
(new-if (= 1 1)0 5)
#|①(new-if 述部 後節、ほかの節)と②を対応付けます。
②(predicateが真ならthen-clauseと返す。そのほかならelse-clauseと返す。 ⇒☆ここで、特殊形式じゃなくしている|#

(define (avarage x y)
(/ (+ x y) 2))
(define (square x)
(* x x))

(define (improve guess x)
(avarage guess (/ x guess)))
(define (good-enough? guess x)
(< (abs (- (square guess) x)) 0.001))


;各定義類
(define (sqrt-iter guess x )
(new-if (good-enough? guess x)
guess
(sqrt-iter (improve guess x)
x)))

(trace sqrt-iter)
(sqrt-iter 3 9)


#|③(sqrt-iter guess x)を以下と対応付けます。
  ①new-if(good-enough? guess x)が真ならguess、それ以外なら(sqrt-iter(guess x)x)と返す。
SICPは作用的順序を使っている、☆より、特殊形式ではないただの手続きなので
③と②の「それ以外」が再帰しぱなしになる|#