r5rs eval 在其词法范围内找不到引用

r5rs eval not finding reference within its lexical scope

如果 eval(interaction-environment) 应该可以访问在调用时的词法范围内定义的所有内容,那么为什么我在尝试 运行下面的代码?

Welcome to DrRacket, version 6.3 [3m].
Language: R5RS; memory limit: 128 MB.
why does this work? object_function: undefined;
 cannot reference undefined identifier

代码:

(define (disp x)
  (display x))
(eval '(disp "why does this work?") (interaction-environment))

;The below doesn't work

((lambda ()
  (define (object_function x)
    (display x))
  (eval '(object_function "But not this?") (interaction-environment))))

(define (object)
  (define (object_function x)
    (display x))
  (eval '(object_function "And not this?") (interaction-environment)))
(object)

如果我这样改:

;The below does work

(define (object_function x)
  (display x))

((lambda ()
   (eval '(object_function "Why does it work now?") (interaction-environment))))

(define (object)
  (eval '(object_function "And now?") (interaction-environment)))
(object)

输出:

Welcome to DrRacket, version 6.3 [3m].
Language: R5RS; memory limit: 128 MB.
Why does it work now?And now?

使用 eval 本身就可以正常工作,但是将其包装在定义的函数或 lambda 中,它找不到与 [=14= 相同范围内的本地定义函数] 函数被调用。

我可能误解了 evalinteraction-environment 如何处理词法作用域,但如果有人能阐明这一点,那将会有所帮助。

eval 评估数据时,它是在顶层进行的。您调用 eval 的词法深度不会泄漏到评估中。第二个参数仅在您可以访问的三个不同的全局环境之间发生变化。

define 在过程中或 let 只是一个奇特的 letrec ,因此是一个词法绑定。 eval 将不可用。顶级 define 进行全局绑定,并且 将从 eval 开始可用,前提是使用 interaction-environment

实施不必实施 interaction-environment,因为它是可选的。需要的环境是null-environment,只有特殊形式,scheme-report-environment,这是系统的初始环境。

eval 是一个强大的功能,通常是错误的解决方案。如果你需要使用 eval.

通常你做错了