2012-07-04 16 views
7

Ćwiczenie 1.5. Ben Bitdiddle opracował test w celu ustalenia, czy tłumacz, z którym ma do czynienia, używa oceny aplikacyjnej - zlecenia lub oceny normalnego rzędu. Definiuje się następujące dwa procedury:SICP Ćwiczenie 1.5

(określenie (P) (P))

(określenie (test-y) (jeśli (= X 0) y))

Potem ocenia wyrażenie

(test 0 (p))

Jakie zachowanie będzie Ben obserwować z tłumaczem, który używa ocenę aplikacyjnych-order? Jakie zachowanie będzie obserwował przy pomocy interpretera , który wykorzystuje ocenę normalnego rzędu?

Rozumiem odpowiedź na ćwiczenie; moje pytanie dotyczy tego, jak (p) jest interpretowane w porównaniu z p. Na przykład (test 0 (p)) powoduje zawieszenie się tłumacza (co jest oczekiwane), ale (test 0 p) z powyższą definicją natychmiastowo ocenia wartość 0. Dlaczego?

Co więcej, przypuśćmy, że zmieniliśmy definicję na (define (p) p). Przy podanej definicji (test 0 (p)) i (test 0 p) obaj oceniają wartość 0. Dlaczego tak się dzieje? Dlaczego tłumacz nie zwisa? Używam Dr Racket z pakietem SICP.

Odpowiedz

15

p to funkcja. (p) to połączenie z funkcją.

W swoim tłumaczu ocen p.

p <Return> 
==> P : #function 

Teraz oceń (p). Upewnij się, że wiesz, jak zabić swojego tłumacza! (Prawdopodobnie jest “ Zatrzymaj ” przycisk Dr. Racket.)

(p) 

Zauważ, że nic się nie dzieje. A przynajmniej nic nie widać. Interpretator obraca się, eliminując ogony (tak, używając pamięci bliskiej 0), wywołując p.

Jako p i (p) ocenić różne rzeczy, należy oczekiwać różnych zachowań.

Co do twojego drugiego pytania: definiujesz p jako funkcję, która zwraca się sama. Ponownie spróbuj ocenić p i (p) przy pomocy swojego (define (p) p) i zobaczyć, co otrzymasz. Moje przypuszczenie (używam komputera, na którym nie mogę niczego zainstalować i który nie ma schematu) jest to, że będą oceniać to samo. (Mogę nawet założyć, że (eq? p (p)) oceni na #t.)

+0

+1 zwięzła odpowiedź. Spróbuj także http://codepad.org. –

+0

Dzięki. Ja również szukam odpowiedzi. – user1166240