6

質問に加えて、SICP の演習 1.6 の説明は何ですか? . Dr. Racket (R5RS) は sqrt-iter 関数を "if" 付きで有限時間で評価し、正常な順序評価を明確に示しています。しかし、演習1.5の例を使用すると

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

無限ループに入り、「if」が適用可能な順序評価を使用していると思わせます。どこが間違っているのですか?

4

2 に答える 2

10

何が起こるかというと、実際に を呼び出すに両方の引数が評価されるif適用可能な評価順序のため、式は永遠にループします。testtest(p)

同じプロシージャが通常の順序で評価された場合、0 が返されます。これが、この例が最初に示していることです。

于 2012-09-11T21:43:58.743 に答える
3

1行目に#langスキームディレクティブを付けてDrRacketを使って、こんな風にやってみたのですが…

;say "hi" to Ben Bitdiddle

(define (q) (display "Hello?...Ben?)

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

次に、DrRacket 5.3 デバッグ ツールを使用して評価を進めました。
それは明らかに適用順序評価です。

評価ウィンドウの表示 -> Hello? ... ベン?DrRacket は「if」に入る前に (q) の呼び出しを評価します。

于 2012-10-20T22:19:48.897 に答える