2012-09-11 7 views
5

Zusätzlich zu Frage What's the explanation for Exercise 1.6 in SICP?. Also Dr. Racket (R5RS) wertet die sqrt-iter-Funktion mit "if" in endlicher Zeit aus, was die normale Reihenfolge der Auswertung deutlich zeigt. Aber wenn ich beispielsweise verwenden, um von Übung 1,5SICP Übung 1.5 und 1.6

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

geht es in Endlosschleife, was ich denke „wenn“ verwendet applicative um Auswertung. Also, wo liege ich falsch?

Antwort

8

Was passiert, ist, dass die if nie erreicht: gerade wegen der applicative Reihenfolge der Auswertung beide Argumente zu test ausgewertet erhalten vortest tatsächlich fordern, und der Ausdruck (p) Schleife wird für immer.

Wenn das gleiche Verfahren mit normaler Reihenfolge ausgewertet würde, würde es Null zurückgeben, das ist es, was dieses Beispiel an erster Stelle zu demonstrieren versucht.

3

Mit DrRacket mit einer #lang Schema Richtlinie in der ersten Zeile, versuchte ich es auf diese Weise ...

;say "hi" to Ben Bitdiddle 

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

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

Dann habe ich das DrRacket 5.3 Debug-Tool durch die Auswertung Schritt.
Es ist eindeutig Anwendungsanweisung Auswertung.

Eval Fenster zeigt -> Hallo? ... Ben? gefolgt von einem 0 cuz DrRacket wertet den Aufruf von (q) aus, bevor das "if" eingegeben wird.

Verwandte Themen