練習問題その3

問題1.4

a に b の絶対値を足す。
それにしても(if (> b 0) + -) の結果を演算子として使えるというのは凶悪ですね。

問題1.5

まず関数 (p) は自分自身を延々と呼び続けるので無限ループになる。
で、関数、(test x y) は x が 0 なら 0 を返し、そうでなければ y の値を返すので、(test 0 (p)) が呼ばれたときの結果は0になりそうだけど、実際に処理系(Chez Scheme)で評価すると結果は無限ループ。まず(p)を評価しようとして(作用的順序で評価して)無限ループに入ってしまった。逆に正規順序で評価されるならば、(test 0 (p)) は まず、

 (if (= 0 0) 0 (p))

と展開されるので、(p) は実行されず、結果は0になるはずである。
(Chez Schemeで実際に展開された式を評価したところ、無限ループに入らずに 0 を返した。)

問題1.6

処理系は作用的順序で通常の式を評価するので、new-if の引数 predicate の値に関わらず sqrt-iter の再起呼び出しを始めてしまう。したがって平方根の計算は終わらず、無限ループに陥る。

問題1.7

なんか問題の意味が良くわからない。数学苦手。

問題1.8

あとで。