如果带有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
函数在同一范围内的本地定义的函数被称为。
我可能误解了eval
或eval
如何处理词汇范围,但如果有人能够对此有所了解,那将会有所帮助。
答案 0 :(得分:4)
当eval
评估数据时,它会在顶层进行评估。您调用eval
的词汇深度不会泄漏到评估中。第二个参数仅在您可以访问的三个不同的全局环境之间发生变化。
define
或者只是一个花哨的letrec
,因此是一个词法绑定。它不会从eval
获得。顶级define
进行全局绑定, it 将在eval
iff interaction-environment
使用。
实现不必实现interaction-environment
,因为它是可选的。所需的环境为null-environment
,只有特殊表单,scheme-report-environment
,这是系统的初始环境。
eval
是一个强大的功能,通常是错误的解决方案。如果您需要使用eval
,通常会出错。