2012-07-04 13 views
7

Aufgabe 1.5. Ben Bitdiddle hat einen Test erfunden, um zu bestimmen, ob der Interpreter, mit dem er konfrontiert ist, die Anwendung applicative order evaluation oder normal-order evaluation verwendet. Er definiert die folgenden zwei Verfahren:SICP Übung 1.5

(define (p) (p))

(definieren (Test xy) (if (= x 0) y))

er dann das wertet Ausdruck

(Test 0 (p))

Welches Verhalten wird Ben mit einem Dolmetscher beobachten, die applicative Ordnung Auswertung verwendet? Welches Verhalten wird er mit einem Interpreter beobachten, der die Auswertung normaler Ordnung verwendet?

Ich verstehe die Antwort auf die Übung; meine Frage liegt darin, wie (p) gegen p interpretiert wird. Zum Beispiel bewirkt (Test 0 (p)), dass der Interpreter hängt (was erwartet wird), aber (Test 0 p) mit der obigen Definition wird sofort zu 0 ausgewertet. Warum?

Angenommen, wir haben die Definition in (define (p) p) geändert. Mit der angegebenen Definition (Test 0 (p)) und (Test 0 p) werden beide zu 0 ausgewertet. Warum tritt dies auf? Warum hängt der Dolmetscher nicht? Ich verwende Dr. Racket mit dem SICP-Paket.

Antwort

15

p ist eine Funktion. (p) ist ein Aufruf einer Funktion.

In Ihrem Interpreter bewerten p.

p <Return> 
==> P : #function 

Jetzt bewerten (p). Stellen Sie sicher, dass Sie wissen, wie Sie Ihren Dolmetscher töten können! (Wahrscheinlich gibt es eine “ Stopp ” Taste in Dr. Racket.)

(p) 

Beachten Sie, dass nichts passiert. Oder wenigstens nichts sichtbar. Der Interpreter dreht sich weg und eliminiert Tail-Aufrufe (also mit fast 0 Speicher) und ruft auf.

Wie und (p) zu verschiedenen Dingen auswerten, sollten Sie ein anderes Verhalten erwarten.

Zu Ihrer zweiten Frage: Sie definieren zu einer Funktion, die sich selbst zurückgibt. Versuchen Sie es erneut mit und (p) mit Ihrem (define (p) p) und sehen Sie, was Sie bekommen. Meine Vermutung (Ich benutze einen Computer, auf dem ich nichts installieren kann und der kein Schema hat) ist, dass sie dasselbe bewerten werden. (Ich könnte sogar wetten, dass (eq? p (p)) zu #t auswerten wird.)

+0

+1 prägnante Antwort. Versuchen Sie auch http://codepad.org. –

+0

Danke. Ich suche auch nach der Antwort. – user1166240