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