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使用 的预定义定义,尽管它使用. 我必须重新定义才能识别. 在这两个新定义中都会立即得到认可,这是我所期望的。此外,两个解释器都会立即识别 的任何进一步定义,而无需重新定义.+fshow+mit-scheme+show

幕后发生了什么guile使它以不同的方式绑定到这些重新定义的运算符的引用?

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

4

1 回答 1

7

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

实际上,如果您首先(define (+ a b) 4)在程序的最顶层进行,Guile 不会进行该优化,您将获得4,45,5MIT Scheme 一样的结果。

编辑:实际上,Guile 似乎会优化+以引用其自己的本机构+造,这意味着即使您不使用常量(没有常量折叠),您仍然无法+像那样重新定义。

于 2010-08-17T22:13:37.970 回答