6

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

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

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

2 回答 2

6

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

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

于 2011-07-05T15:22:09.113 回答
2

eval. 因此,在您的示例中,eval无法触及词法变量xand 。y

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

于 2011-07-05T15:22:04.900 回答