代码之家  ›  专栏  ›  技术社区  ›  Ian Mackinnon

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

  •  10
  • Ian Mackinnon  · 技术社区  · 14 年前

    我在重新定义 + 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"
    

    诡计 函数 show 即使我重新定义了它,尽管它使用了 f . 我必须重新定义 显示 让它认识到 . 在 mit-scheme 两个口译员都能立即识别,而无需重新定义 显示 .

    电影里的幕后发生了什么 诡计 使它以不同的方式绑定对这些重新定义的操作符的引用?

    为什么两个口译员之间有区别?

    1 回复  |  直到 14 年前
        1
  •  7
  •   erjiang    14 年前

    看来Guile错误地认为没有人疯狂到可以重新定义 + (+ 2 2) => 4 ,制作 (display (+ 2 2)) 成为 (display 4) . 这就解释了为什么你需要重新定义 show 为了反映你的新生活 + .

    事实上,如果你第一次 (define (+ a b) 4) 4,4 5,5 就像麻省理工学院的计划。

    实际上,看起来Guile会优化 + 就像那样。

    推荐文章