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

Mat*_*att 6 environment scheme eval r6rs

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

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

(let ((x 4)
      (y 5))
  (eval '(+ x y) ???))
Run Code Online (Sandbox Code Playgroud)

Eli*_*lay 6

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

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