关于编程语言方案的R7RS报告描述了在Scheme系统中运行Scheme代码的两种方法:
1)计划系统可以运行报告第5.1节所述的程序。
2)方案系统可以提供一个读-读-打印-循环,其中方案代码是交互解释的。
我的问题是,如何将这两种运行Scheme代码的方式反映在Scheme系统中,并将其包含在R7RS报告中。
在运行中的Scheme系统中,有eval库过程,它执行Scheme代码,因此eval看起来像我正在搜索的东西。
但是,我可以插入eval的唯一可以保证的可变环境是由interaction-environment repl库过程返回的环境。但是,使用这种方法,我无法从上面可靠地模拟REPL (第2点),因为REPL允许导入表单,而eval过程并不需要导入表单。
此外,由于其他原因,我不能使用交互环境对完整的eval程序进行处理:它通常不是空的,特别是它包含了(scheme base)的所有绑定。
为了在运行方案系统中实现1),eval库过程environment看起来很有希望,因为它允许预先导入库(这是运行程序的一部分)。但是,环境是不可变的,所以我不能在环境中评估define。一种解决方法是将要运行的程序主体封装为lambda形式,这样define就可以定义局部变量。但是,这也不起作用:在lambda表单中,所有定义都必须在主体的开头(对于Scheme程序的顶层不是这样),而在lambda表单库中的绑定可以在词汇上被覆盖,而顶级绑定是不可能的。
由于Scheme是图灵全的,我当然可以在正在运行的Scheme系统中模拟Scheme系统,但是我想知道使用eval过程是否有可能。我感兴趣的一个原因是eval可能会被优化(例如,通过JIT编译器后端),所以使用这个过程可能会给出接近本地速度的速度(与手工编写一个简单的解释器相比)。
发布于 2014-01-10 03:28:17
R7RS-small并不打算用于这种反射实现。R7RS-large将提供一个支持用户创建的可变环境的库。
https://stackoverflow.com/questions/20981637
复制相似问题