問題1.1〜問題1.5
問題1.1 略
問題1.2 略
問題1.3
> (define (problem1-3 a b c) (cond ((and (>= b a) (>= c a)) (+ (* b b) (* c c))) ((and (>= a b) (>= c b)) (+ (* a a) (* c c))) ((and (>= a c) (>= b c)) (+ (* a a) (* b b))))) > (problem1-3 1 3 5) 34 > (problem1-3 5 4 3) 41
プログラムの再利用性という観点からは、やはり補助関数を使うべき。
> (define (problem1-3 a b c) (- (+ (square a) (square b) (square c)) (square (min a b c))))
minやmaxが使えるようなので、全部足してから一番小さいものを引くことにした。
問題1.4
演算子としてsquareのようにユーザがdefineで定義した合成手続きを使っているのではなく、式を用いていることに注意。
下のように確かに正しく動作している。
> (a-plus-abs-b 2 3) 5 > (a-plus-abs-b 2 -3) 5
問題1.5
作用的順序の評価:
手続きpの評価が無限ループとなるため終了しない。
正規順序の評価:
手続きpの代わりに0 を評価するため式の評価として0を返す。
注意。下の両者の差分を意識すること。
前者はオブジェクト1を指す名前としてpを定義しており、後者はオブジェクト1を指す名前として手続きpを定義している。そのためpの評価結果はprocedureとなる。
> (define p 1) > p 1 > (define (p) 1) > p #<procedure:p> > (p) 1