R7RS计划的反思能力

时间:2014-01-07 20:52:30

标签: reflection scheme eval read-eval-print-loop r7rs

关于编程语言Scheme的R7RS报告描述了在Scheme系统中运行Scheme代码的两种方法:

1)方案系统可以运行报告中第5.1节所述的程序。

2)方案系统可以提供read-eval-print-loop,其中Scheme代码以交互方式解释。

我的问题是如何在Scheme系统中反映这两种运行Scheme代码的方式,以及R7RS报告中包含的内容。

有一个eval库过程eval,它在正在运行的Scheme系统中执行Scheme代码,因此eval看起来就像我在搜索的内容。

但是,我可以插入eval的唯一保证可变环境是interaction-environment repl库过程返回的环境。但是,有了这个,我无法可靠地模拟上面的REPL(第2点),因为REPL允许导入表单,eval过程不需要。

此外,由于其他原因,我无法使用交互环境eval完整的Scheme程序:它通常不为空,特别是它包含(scheme base)的所有绑定。

为了实现1)在正在运行的Scheme系统中,eval库过程environment看起来很有希望,因为它允许事先导入库(这是运行程序的一部分)。但是,环境是不可变的,所以我无法评估环境中的define。一种方法是将程序体包装成lambda形式,以便define定义局部变量。但是,这也不起作用:在lambda形式内,所有定义都必须出现在主体的开头(对于Scheme程序的顶层不是这样)并且在{{1}内部表单库绑定可以被词法覆盖,这是顶级绑定所无法实现的。

由于Scheme是Turing-complete,我当然可以在正在运行的Scheme系统中模拟一个Scheme系统,但我想知道是否可以通过lambda过程实现。我感兴趣的一个原因是eval可能会被优化(例如通过JIT编译器后端),因此使用此过程可能会提供接近本机的速度(与手动编写简单的解释器相比)。

1 个答案:

答案 0 :(得分:6)

R7RS-small不适用于此类反射实现。 R7RS-large将提供一个支持用户创建的可变环境的库。