SICP練習問題1-3,1-5,1-6

いろいろと雑多な用事で日記の更新&独学が遅れた。
第一章はざっと目を通して、第一章にかかれた範囲でSchemeの概念はわかったつもりである。

あとはざっと重要そうな練習問題をこなしてみる。

練習問題1-3.
要は「3つの引数をとって、大きい二つの数の二乗の和を返す」手続きの定義.
...ということは、最初から3つの二乗の和をとって、最小値の二乗を引けばよいかも。
最小値...多分minなんて手続きがありそうだ...ホントにあった。というわけで

(define (square-bigger2 x y z)
(- (+ (* x x) (* y y) (* z z)) (* (min x y z) (min x y z)))
)

と書いてみた.
(手続き名が無茶苦茶センスねえなあ.しかも手続きの記述自体はわかりやすいかもしれないが、乗算が余分になるのが気に入らないなあ.CPU的なコストがかかりそうだし.あと、重複する(min x y z)も見栄えがわるいなあ)

練習問題1-5.
これは、
「作用的順序」->値が必要になるまで被演算子を評価しない
この問題のケースでは、xが0のため、yを評価する必要がない。
このとき、yに束縛されたpが評価されないので、手続きの結果は0となる.

「正規順序」->使う、使わないにかかわらず、まずすべての引数を評価する.
この問題のケースでは、ifの述語両方(0とy)が評価される.
このとき、yに束縛されたpも評価の対象となる.pは単にpを束縛しているだけなので、pを評価した結果はpとなる。
つまり、延々終わることのない評価に突入し、結果として評価系は応答しなくなる.
ということかな。

うちで使っているgoshは正規順序だったね。

練習問題1-6本質的には練習問題1-5.と同じことだと思います.
new-ifは単なる手続きなので、「正規順序」評価が適用され再帰で実行されるsqrt-iter内のnew-ifがまた評価される.....。
つまり、練習問題1-5におけるpの評価と同様のことが起きて、評価系がだんまりになる、ということでしょう。