SICP読書録 その1 作用順序

Exercise 1.5.のBen Bitdiddleが考案したapplicative-order(作用順序、適応順序?)かどうかを調べる方法の動作解析。

(define (p) (p))

(define (test x y)
	(if (= x 0)
		x
		y))

(test 0 (p))

ここで僕はifの(= x 0)を評価する前にxおよびyを評価するから(test 0 (p))において(= x 0)が真になるにもかかわらず(p)を再帰してしまうのが問題なのかと考えて解けたと思った。でも、Exercise 1.6.で引っかかってしまった。よくよく考えてみると、1.1.7 Square Roots by Newton's Methodで気になるところが。

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

(define (improve guess x)
	(average guess (/ x guess)))

(define (average x y)
	(/ (+ x y) 2))

仮にapplicative-orderで評価すると、ifの評価対象である(good-enough? guess x)よりも先に、guessと(sqrt-iter (improve guess x) x)を先に評価することになるはず(あるいは(good-enough? guess x)を先に評価してもguessと(sqrt-iter (improve guess x) x)を評価した後でしかifの分岐が行えない可能性がある。でもそうなると再帰関数となるsqrt-iterの門番はどこになるの?

そう考えると、Exercise 1.5.の考え方が間違っている可能性もある。。。悩み中