我在重新定义 +
时收到了意外的结果使用 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
的幕后发生了什么使其以不同方式绑定(bind)对这些重新定义的运算符的引用?为什么两个解释器之间存在差异?
最佳答案
看起来 Guile 错误地假设没有人足够疯狂来重新定义 +
并且正在优化折叠(+ 2 2) => 4
, 制作 (display (+ 2 2))
成为(display 4)
.这可以解释为什么您需要重新定义 show
为了反射(reflect)您的新+
.
确实,如果你先做 (define (+ a b) 4)
在你程序的最顶端,Guile 不会做那个优化,你会得到 4,4
和 5,5
就像麻省理工学院计划一样。
编辑:实际上,Guile 似乎会优化 +
引用自己的 native +
构造,这意味着即使您不使用常量(没有常量折叠),您仍然无法重新定义 +
像那样。
关于operators - 方案:为什么在重新定义预定义运算符时会出现这种结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3506563/