在R6RS Scheme中,有没有办法让当前环境与eval一起使用?

时间:2011-07-05 15:03:13

标签: scheme eval environment r6rs

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

例如,问题标记应该是以下表达式返回9?

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

2 个答案:

答案 0 :(得分:6)

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

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

答案 1 :(得分:2)

eval的角度来看,词汇变量永远不会成为环境的一部分。因此,在您的示例中,eval无法触及词法变量xy

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