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= 相同范围内的本地定义函数] 函数被调用。
我可能误解了 eval
或 interaction-environment
如何处理词法作用域,但如果有人能阐明这一点,那将会有所帮助。
当 eval
评估数据时,它是在顶层进行的。您调用 eval
的词法深度不会泄漏到评估中。第二个参数仅在您可以访问的三个不同的全局环境之间发生变化。
define
在过程中或 let 只是一个奇特的 letrec
,因此是一个词法绑定。 eval
将不可用。顶级 define
进行全局绑定,并且 它 将从 eval
开始可用,前提是使用 interaction-environment
。
实施不必实施 interaction-environment
,因为它是可选的。需要的环境是null-environment
,只有特殊形式,scheme-report-environment
,这是系统的初始环境。
eval
是一个强大的功能,通常是错误的解决方案。如果你需要使用 eval
.
通常你做错了
如果 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= 相同范围内的本地定义函数] 函数被调用。
我可能误解了 eval
或 interaction-environment
如何处理词法作用域,但如果有人能阐明这一点,那将会有所帮助。
当 eval
评估数据时,它是在顶层进行的。您调用 eval
的词法深度不会泄漏到评估中。第二个参数仅在您可以访问的三个不同的全局环境之间发生变化。
define
在过程中或 let 只是一个奇特的 letrec
,因此是一个词法绑定。 eval
将不可用。顶级 define
进行全局绑定,并且 它 将从 eval
开始可用,前提是使用 interaction-environment
。
实施不必实施 interaction-environment
,因为它是可选的。需要的环境是null-environment
,只有特殊形式,scheme-report-environment
,这是系统的初始环境。
eval
是一个强大的功能,通常是错误的解决方案。如果你需要使用 eval
.