SICP 問題1.6

   

問題 1.6

Alyssa P. Hackerはifが特殊形式である理由が分らない. 「cond を利用し, 普通の手続きとして定義してはいけないの?」と聞いた. Alyssaの友人のEva Lu Atorはそうすることはもちろん出来るといって, ifの新版を定義した:

EvaはAlyssaにプログラムを見せた:

Alyssaは喜び, 平方根のプログラムを書き直すのにnew-ifを使った:

Alyssaが平方根を計算するのにこれを使おうとすると, 何が起きるか, 説明せよ.

new-ifに置き換える前の動作するプログラム

特殊形式の if ではなく new-if を使った方のプログラムはループから抜け出せなくなる。

理由は解釈系が作用的順序に従って式を評価するため、演算子と非演算子をはじめに評価する。

ここでいう演算子はnew-if、非演算子はguessとsqrt-iterになるだろうからsqrt-iterの中で自身を再帰的に呼び出し続けるためじゃないかなあ。

一方でnew-ifを特殊形式のifに置き換えると述語の真偽次第で評価する式が変わるから自身を再帰的に呼び出し続けることがなくなって期待通りの動作をする模様。

 - SICP