6

次の値に基づいて決定する必要があります。

(テスト 0 (p))

ここで、test は次のように定義されます。

(define (test x y)
  (if (= x 0)
      0
      y))

p は次のように定義されます。

(define (p) (p))

私が評価(test 0 (p))すると、インタプリタは無限ループに入り、評価中であることが示唆されますp。オペランドはパラメーターに置換される前に評価されるため、これは正規順序評価を示しています。SICP によると、LISP は適用順序評価を使用します。

4

1 に答える 1

14

オペランドはパラメーターに置換される前に評価されるため、これは通常の順序での評価を示しています。

実際、あなたはそれを間違った方法で手に入れました。適用順序は、オペランドが最初に評価されるときです。通常の順序は、引数が評価されていない式に代入される場合です。

したがって、ラケットは適用可能な順序を使用します。これは、あなたが言ったように、引数が最初に評価されるためです(「レイジーラケット」を使用しない限り、必要に応じて呼び出し、別名遅延評価を使用します。これは、各引数が最大1回評価されることを除いて、通常の順序のようです)。

于 2010-12-12T15:40:23.877 に答える