7

演習 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 パッケージで使用しています。

4

1 に答える 1

16

p関数です。 (p)関数の呼び出しです。

インタプリタで評価しpます。

p <Return>
==>  P : #function

を評価し(p)ます。インタプリタを殺す方法を知っていることを確認してください! (おそらくDr.Racketには「ストップ」ボタンがあります。)

(p)

何も起こらないことに注意してください。または、少なくとも、何も表示されません。インタープリターはスピンアウトし、末尾呼び出しを排除して (つまり、ほぼ 0 のメモリを使用)、 を呼び出しpます。

aspとas(p)は異なるものに評価されるため、異なる動作を期待する必要があります。

あなたの2番目の質問について:あなたはp自分自身を返す関数であることを定義しています。繰り返しますが、 を評価p(p)てみて(define (p) p)、何が得られるかを確認してください。私の推測では (私は何もインストールできず、スキームのないコンピューターを使用しています)、それらは同じものに評価されるということです。(私はそれ(eq? p (p))が に評価されるに違いない#t.)

于 2012-07-04T19:57:19.283 に答える