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

标签 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 的幕后发生了什么使其以不同方式绑定(bind)对这些重新定义的运算符的引用?

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

最佳答案

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

确实,如果你先做 (define (+ a b) 4)在你程序的最顶端,Guile 不会做那个优化,你会得到 4,45,5就像麻省理工学院计划一样。

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

关于operators - 方案:为什么在重新定义预定义运算符时会出现这种结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3506563/

相关文章:

c++ - 友元函数无法访问私有(private)数据成员

c - 运算符优先级背后的逻辑

方案获取列表中的最后一个元素

scheme - 对 foldr/foldl 中的 "Init/Base"感到困惑( Racket )

c - 如何对 SMOB 类型执行条件语句?

c - 如何从 Guile 中的 Scheme 函数创建 C 函数指针?

php - 使用 "<="或 ">="比较 float 是否理想?

c# - 字节公因数

algorithm - 在Scheme中编写递归枚举函数

Lisp Web 框架?