3

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

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

2) 一个方案系统可以提供一个读取-评估-打印-循环,其中方案代码被交互解释。

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

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

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

另外,由于其他原因,我不能使用交互环境来eval编写完整的 Scheme 程序:它通常不是空的,特别是它包含(scheme base).

为了实现 1) 在运行的 Scheme 系统中,eval 库过程environment看起来很有希望,因为它允许预先导入库(这是运行程序的一部分)。但是,环境是不可变的,所以我无法评估define环境中的 s 。一种出路是将要运行的程序的主体包装在一个lambda表单中,以便define定义局部变量。然而,这也行不通:在lambda表单内部,所有定义都必须出现在主体的开头(这对于 Scheme 程序的顶层而言并非如此),并且在lambda表单库内部,绑定可以在词法上被覆盖,这顶级绑定是不可能的。

由于 Scheme 是图灵完备的,我当然可以在运行的 Scheme 系统中模拟一个 Scheme 系统,但我想知道仅使用该eval过程是否有可能。我感兴趣的一个原因是它eval可能会被优化(例如,通过 JIT 编译器后端),所以使用这个过程可能会提供接近本机的速度(与手动编写简单的解释器相比)。

4

1 回答 1

6

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

于 2014-01-10T03:28:17.780 回答