方案:重新定义预定义运算符时为什么会出现这种结果?

时间:2010-08-17 20:15:39

标签: operators scheme guile

在使用+重新定义方案程序中的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幕后发生的事情是什么让它以不同方式绑定对这些重新定义的运算符的引用?

为什么两个解释器之间存在差异?

1 个答案:

答案 0 :(得分:7)

看起来Guile错误地认为没有人疯狂地重新定义+并正在优化折叠(+ 2 2) => 4,使(display (+ 2 2))成为(display 4)。这可以解释为什么您需要重新定义show以反映新的+

事实上,如果您首先在程序的最顶端执行(define (+ a b) 4),那么Guile将不会执行此优化,您将获得4,45,5,就像MIT Scheme一样。

编辑:实际上,看起来Guile会优化+来引用自己的原生+结构,这意味着即使你不使用常量(也没有常数)折叠)你仍然无法像那样重新定义+