代码之家  ›  专栏  ›  技术社区  ›  Cam

为什么必须在编译器看到所有过程之前定义它们?

  •  0
  • Cam  · 技术社区  · 14 年前

    例如,查看以下代码(来自tspl4):

    (define proc1
      (lambda (x y)
        (proc2 y x)))
    

    如果我在scheme中运行这个程序。。。

    #!r6rs
    (import (rnrs))
    
    (define proc1
      (lambda (x y)
        (proc2 y x)))
    

    我得到这个错误:

    expand: unbound identifier in module in: proc2
    

    #!r6rs
    (import (rnrs))
    
    (define proc2
      +)
    
    (define proc1
      (lambda (x y)
        (proc2 y x)))
    
    (display (proc1 2 3)) ;output: 5
    
    1 回复  |  直到 9 年前
        1
  •  2
  •   Eli Barzilay    14 年前

    它们都必须在同一个模块中定义(r6rs行话中的“库”)。但是你可以按照你想要的任何顺序定义它们——例如,在你的最后一次剪贴中,你可以交换这两个定义,这样就可以很好地工作了。但请注意,不能将定义放在 display 这是一个使用 价值 ,因此如果将函数定义移到后面,则会出现运行时错误(请注意这是一个 错误,而不是编译时错误。)