什么时候可以覆盖(R7RS)方案中的顶级绑定?

时间:2012-09-09 12:25:02

标签: scheme r7rs

我已阅读forthcoming R7RS scheme standard (small language)的当前草稿,但我不明白在哪些条件下重新定义顶级绑定不是错误。

我想可以定义设置!第二次在程序的顶层引入的绑定。但是从外部库导入的绑定呢?是否可以通过标准覆盖这些绑定?

报告第26/27页,它说:

  

程序的最高级别还可能包括导入声明。   在库声明中,导入是错误的   使用不同的绑定多次使用相同的标识符,   或者使用define重新定义或改变导入的绑定,   define-syntax或set!。但是,REPL应该允许   这些行动。

这是否意味着重新定义只是在导入绑定的库中发生时才会出错?

据我所知,如果编译器不知道是否 + 仍然意味着内置添加或是否是任何其他用户指定的错误,它禁止编译器进行优化。但是从这个角度来看,限制禁止在图书馆层面重新绑定是没有意义的,因为它对程序中的导入绑定也是有意义的(至少)。

P.S。:因为这完全是关于计划项目的环境:我是否正确地说环境不是一等公民,因为人们无法掌握当前的环境? (反过来,它允许编译的程序忘记所选择的绑定名称。)

1 个答案:

答案 0 :(得分:4)

一般原则是在库中声明的绑定只能在同一个库中进行可移植的变异。如果将库的绑定导入程序(或导入另一个库),则不能在那里进行变异。因此,如果程序导入(scheme base),则标识符+始终引用标准添加例程(在lambda, let, let*本地隐藏的区域除外,或者当然,您拥有的是什么? )。

在REPL或REPL执行的脚本中,此限制不适用。此外,实现可以通过解除限制来扩展标准语言。

与当前全局环境最接近的等价物是(interaction-environment)的结果,它表示REPL的可变环境(如果有)。如果REPL未使用或不存在,则可以通过在与当前导入集相对应的参数上调用environment来模拟当前但不可变的环境。与其前身一样,R7RS没有任何词汇环境的表示。

相关问题