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

Ian*_*non 10 scheme guile operators

+在使用的方案程序中重新定义运算符时,我收到了意外的结果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"
Run Code Online (Sandbox Code Playgroud)

guile函数中show使用了预定义的定义,+即使在我重新定义它之后,它也使用了新的定义f.我必须重新定义show以使其认识到新的定义+.在mit-scheme这两个新定义中都会立即得到认可,这正是我所期待的.此外,任何进一步的定义+都可以立即得到两位口译员的认可,而无需重新定义show.

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

为什么两个口译员之间存在差异?

erj*_*ang 7

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

事实上,如果你第一次(define (+ a b) 4)在你的计划的最顶层做,Guile将不会做那个优化,你会得到4,4,5,5就像麻省理工学院计划.

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