演習 1.5. Ben Bitdiddle は、直面しているインタプリタが適用順序評価を使用しているか正規順序評価を使用しているかを判断するためのテストを発明しました。彼は次の 2 つの手順を定義します。
(定義 (p) (p))
(定義 (テスト xy) (if (= x 0) 0 y))
次に、式を評価します。
(テスト 0 (p))
アプリケーション順序評価を使用するインタープリターで、ベンはどのような動作を観察するでしょうか? 正規順序評価を使用するインタープリターで、彼はどのような動作を観察するでしょうか?
演習の答えを理解しました。私の質問は、(p) が p に対してどのように解釈されるかにあります。たとえば、 (test 0 (p)) はインタープリターをハングさせますが (これは予期されることです)、上記の定義で (test 0 p) を実行するとすぐに 0 と評価されます。なぜでしょうか?
さらに、定義を (define (p) p) に変更したとします。与えられた定義では、(test 0 (p)) と (test 0 p) の両方が 0 に評価されます。これはなぜですか? インタプリタがハングアップしないのはなぜですか? Dr. Racket を SICP パッケージで使用しています。