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
,使它以不同方式绑定对这些重新定义的运算符的引用?
为什么两个口译员之间存在差异?
看起来Guile错误地认为没有人会疯狂地重新定义+
并且正在进行折叠的优化(+ 2 2) => 4
,使得(display (+ 2 2))
成为(display 4)
.这可以解释为什么你需要重新定义show
以反映你的新东西+
.
事实上,如果你第一次(define (+ a b) 4)
在你的计划的最顶层做,Guile将不会做那个优化,你会得到4,4
,5,5
就像麻省理工学院计划.
编辑:实际上,看起来Guile会优化+
引用它自己的原生+
构造,这意味着即使你不使用常量(没有常数折叠),你仍然无法+
像那样重新定义.