R6RS Scheme 中是否有任何方法可以获取当前环境,然后将其作为第二个参数传递给eval
?
例如,以下表达式返回 9 的问号应该是什么?
(let ((x 4)
(y 5))
(eval '(+ x y) ???))
R6RS Scheme 中是否有任何方法可以获取当前环境,然后将其作为第二个参数传递给eval
?
例如,以下表达式返回 9 的问号应该是什么?
(let ((x 4)
(y 5))
(eval '(+ x y) ???))
不,R6RS 中没有这样的东西。一些罕见的实现可能支持类似的东西,但绝大多数(包括eval
其他语言!)这是无法做到的。
原因很简单:它破坏了编译,因为它导致两个函数可以根据本地名称区分,并且在某些情况下还可以禁止简单的优化。例如,如果您可以填写一些内容,???
那么编译器将需要有两个绑定,即使它们可以被优化掉。在可能的极少数情况下,在???
(在某些语言中只是简单地使用eval
)中使用的任何内容都会触发不同的编译,将已知绑定映射到它们的值。(在某些浏览器的 JS 代码中逐字提及会出现一些奇怪的行为eval
,这实际上是同一个问题。)
从eval
. 因此,在您的示例中,eval
无法触及词法变量x
and 。y
更新:从 Guile 2.0.5 开始,您可以使用local-eval
,这确实允许您的 eval 表达式使用本地(词法)变量。但就像 Eli 所说,大多数 Scheme 实现都不支持这一点。