2010-08-17 70 views
10

當使用guile在方案程序中重新定義+運營商時,我收到了意外的結果。我應該指出,這是在嘗試瞭解語言的過程中發生的;這裏沒有嘗試寫一個有用的程序。方案:爲什麼這個結果重新定義預定義的操作符?

下面的代碼:

(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" 

guile功能show使用的+的預定義的定義我已經重新定義它甚至以後,儘管它使用的f的新定義。我必須重新定義show才能識別+的新定義。在mit-scheme這兩個新的定義立即被識別,這是我期待的事情發生。此外,+的任何進一步定義都可以立即被兩位口譯人員認可,而無需重新定義show

guile後臺發生了什麼事情,以便使它對這些重新定義的運算符的引用有不同的綁定?

爲什麼兩位口譯員之間的區別?

+0

有趣。 +1爲非常清楚解釋的問題。 – 2010-08-17 20:29:16

回答

7

看起來Guile錯誤地認爲沒有人足夠瘋狂地重新定義+並且正在對摺疊(+ 2 2) => 4進行優化,使得(display (+ 2 2))變成(display 4)。這可以解釋爲什麼您需要重新定義show以反映您的新+

事實上,如果你第一次在你的程序的頂部做(define (+ a b) 4),Guile不會做這種優化,你將得到4,45,5就像MIT Scheme。

編輯:事實上,它看起來像狡詐將優化+引用自己的本土+結構,也就是說即使你不使用常量(沒有固定摺疊),你仍然將無法重新定義+像。

相關問題