【问题标题】:r5rs eval not finding reference within its lexical scoper5rs eval 未在其词法范围内找到引用
【发布时间】:2016-09-03 22:27:15
【问题描述】:

如果 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 中,它无法找到与调用 eval 函数在同一范围内的本地定义的函数。

我可能会误解 evalinteraction-environment 如何处理词法范围,但如果有人能对此有所了解,那将会有所帮助。

【问题讨论】:

  • 你的前提是错误的; eval 不应该访问它。 interaction-environment 是交互环境,而不是函数中的本地环境。

标签: scope scheme eval lexical-scope r5rs


【解决方案1】:

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

define 在过程中或 let 只是一个花哨的letrec,因此是一个词法绑定。 eval 将无法使用它。顶级 define 进行全局绑定,如果使用了 interaction-environment将从 eval 获得。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-20
    • 1970-01-01
    • 2021-07-12
    • 1970-01-01
    • 1970-01-01
    • 2020-11-23
    相关资源
    最近更新 更多