2010-08-17 10 views
10

Otrzymałem nieoczekiwany wynik podczas redefiniowania operatora + w programie schematu, używając guile. Powinienem zaznaczyć, że miało to miejsce podczas eksperymentowania, aby spróbować zrozumieć język; nie ma tutaj próby napisania przydatnego programu.Schemat: dlaczego ten wynik przy redefiniowaniu predefiniowanego operatora?

Oto kod:

(define (f a b) 4) 

(define (show) 
    (display (+ 2 2)) (display ",") (display (f 2 2)) (newline)) 

(show) 
; guile & mit-scheme: "4,4" 

(define (+ a b) 5) 
(define (f a b) 5) 

(show) 
; mit-scheme: "5,5" 
; guile: "4,5" - this "4" is the unexpected result 

(define (show) 
    (display (+ 2 2)) (display ",") (display (f 2 2)) (newline)) 

(show) 
; guile & mit-scheme: "5,5" 

W guile funkcja show używa predefiniowanego definicję + nawet po ja przedefiniowana go, choć wykorzystuje nową definicję f. Muszę przedefiniować show, aby uzyskać rozpoznanie nowej definicji +. W mit-scheme obie nowe definicje są rozpoznawane natychmiast, co jest tym, czego oczekiwałem. Ponadto, wszystkie dalsze definicje + są natychmiast rozpoznawane przez obu tłumaczy bez konieczności ponownego definiowania show.

Co dzieje się za kulisami w guile, aby powiązać je z tymi zdefiniowanymi na nowo operatorami inaczej?

I dlaczego różnica między dwoma tłumaczami?

+0

Interesujące. +1 dla bardzo jasno wyjaśnionego pytania. –

Odpowiedz

7

Wygląda Guile jest błędnie zakładając, że nikt nie jest na tyle szalony, aby przedefiniować + i dokonuje optymalizacji składanych (+ 2 2) => 4, co (display (+ 2 2)) stać (display 4). To by wyjaśniało, dlaczego musisz przedefiniować show, aby odzwierciedlić swoją nową +.

Rzeczywiście, jeśli najpierw zrobisz (define (+ a b) 4) na samym szczycie twojego programu, Guile nie zrobi tej optymalizacji, a otrzymasz 4,4 i 5,5, podobnie jak program MIT.

Edit: Faktycznie, wygląda na to, Guile zoptymalizuje + odwołać swój rodzimy + konstrukt, co oznacza, że ​​nawet jeśli nie używać stałych (bez stałej składanych) nadal będzie w stanie przedefiniować + takiego .

Powiązane problemy