【问题标题】:In R6RS Scheme, is there a way to get the current environment for use with eval?在 R6RS 方案中,有没有办法让当前环境与 eval 一起使用?
【发布时间】:2011-07-05 15:03:13
【问题描述】:

R6RS Scheme中有什么方法可以获取当前环境,然后将其作为第二个参数传递给eval

例如,下面的表达式返回 9 的问号应该是什么?

(let ((x 4)
      (y 5))
  (eval '(+ x y) ???))

【问题讨论】:

    标签: scheme eval environment r6rs


    【解决方案1】:

    不,R6RS 中没有这样的东西。一些罕见的实现可能支持类似的东西,但绝大多数(包括其他语言的eval!)这是无法做到的。

    这样做的原因很简单:它会破坏编译,因为它会导致根据本地名称区分两个函数,并且在某些情况下还会禁止简单的优化。例如,如果您可以为??? 填写一些内容,那么即使可以优化它们,编译器也需要有两个绑定。在可能的极少数情况下,??? 中使用的任何内容(在某些语言中只是简单地使用eval)都会触发不同的编译,将已知绑定映射到它们的值。 (在某些浏览器的 JS 代码中字面上提到了 eval 有一些奇怪的行为,这实际上是同一个问题。)

    【讨论】:

    • @amoe 内核编程语言使用这样的 eval。
    • @artemonster:不,内核的 eval 和 JS 的很不一样。
    【解决方案2】:

    eval 的角度来看,词法变量绝不是环境的一部分。因此,在您的示例中,eval 无法触及词法变量 xy

    更新:从 Guile 2.0.5 开始,您可以使用local-eval,这确实允许您的 eval 表达式使用本地(词法)变量。但正如 Eli 所说,大多数 Scheme 实现都不支持这一点。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-04
      • 2017-12-27
      • 2021-10-29
      • 2022-08-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多