r5rs eval在其词汇范围内没有找到参考

时间:2016-09-03 22:27:16

标签: scope scheme eval lexical-scope r5rs

如果带有eval的{​​{1}}可以访问在调用它时的词法范围内定义的所有内容,那么当我尝试运行以下代码时,为什么会出现此错误?

(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? 本身它可以正常工作,但将它包装在已定义的函数或lambda中,并且它找不到与eval函数在同一范围内的本地定义的函数被称为。

我可能误解了evaleval如何处理词汇范围,但如果有人能够对此有所了解,那将会有所帮助。

1 个答案:

答案 0 :(得分:4)

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

程序中的

define或者只是一个花哨的letrec,因此是一个词法绑定。它不会从eval获得。顶级define进行全局绑定, it 将在eval iff interaction-environment使用。

实现不必实现interaction-environment,因为它是可选的。所需的环境为null-environment,只有特殊表单,scheme-report-environment,这是系统的初始环境。

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