SICPラン①(p20~)

SICPを読む過程で解いた問題の解答や、理解したことなどを書く。なお私はCSの学位などとは全く無縁であるので、参考になるものはなく間違っていることが多いと思う。

Exercise 1.3:三つの数値のうち大きい二つを選び、それらの二乗和をかえす(三つは任意の異なる整数)

(define (square x) (* x x))
(define (sum x y z)
  (cond ((and (> x y ) (> y z )) (+ (square x) (square y)))
        ((and (> x y ) (> z y )) (+ (square x) (square z)))
        ((and (> y x ) (> x z )) (+ (square y) (square x)))
        ((and (> y x ) (> z x )) (+ (square y) (square z)))
        ((and (> z x ) (> x y )) (+ (square z) (square x)))
        ((and (> z x ) (> y x )) (+ (square z) (square y)))))

Exercise 1.4:以下の手続きの挙動の説明

(define ( a-plus-abs-b a b )
  (( if ( > b 0 ) + - ) a b ))

という式の挙動は、a-plus-abs-bという手続きを定義している。そしてその手続きは、bの正負を判断し、正の場合は+、負の場合は-というオペレータを返す。最後に、そのオペレータはaとbのオペレータとなっている。オペレータの部分が複合式(今回だとifの条件式の部分を指す)でも、問題なく評価は行われる。ifのconsequent部分をb - に置き換えるとnot a procedureというエラーが出る。

Exercise 1.5:以下の手続きについて、適用順序評価と正規順序評価による違いの説明

(define (p) (p))
(define (test x y)
  (if (= x 0 ) 0 y ))
<||
Applicative-Order Evaluation(AOE)だと、引数を評価してから手続きを適用するので、上記の式だとpはpのまま際限なく評価され続ける。一方Normal-Order Evaluation(NOE)だと、基本演算子のみの式になるまで簡約するので条件式が適用されるので、無限に評価されることは生じない。