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 编译器后端),所以使用这个过程可能会提供接近本机的速度(与手动编写简单的解释器相比)。