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

时间:2010-06-04 20:08:47

标签: scheme racket r6rs

例如,看看这段代码(来自tspl4):

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

如果我在计划中运行此程序...

#!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 个答案:

答案 0 :(得分:2)

它们都必须在同一个模块中定义(= r6rs lingo中的“library”)。但是您可以按照您想要的任何顺序定义它们 - 例如,在您的上一个剪辑中,您可以交换这两个定义,它将正常工作。但请注意,您不能将定义放在display行之后 - 这是一个使用其的表达式,因此如果您在其后移动函数定义,您将获得运行时错误。 (注意它是运行时错误而不是编译时错误。)