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

Mar*_*arc 2 scheme r7rs

我已经阅读了即将发布的R7RS方案标准(小语言)的当前草案,但我不明白在什么条件下重新定义顶级绑定不是错误。

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

报告第 26/27 页写道:

程序的顶层还可能包括导入声明。在库声明中,使用不同的绑定多次导入相同的标识符,或者使用 Define、define-syntax 或 set! 重新定义或改变导入的绑定都是错误的。然而,REPL 应该允许这些操作。

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

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

PS:因为这都是关于一个计划程序的环境:我说环境不是一等公民,因为你无法掌握当前的环境,我这样说对吗?(这反过来又允许编译的程序忘记所选择的绑定名称。)

Joh*_*wan 5

一般原则是,在库中声明的绑定只能在同一库中进行可移植的更改。如果将库的绑定导入到程序(或另一个库)中,则它们不能在那里发生突变。因此,如果程序导入(scheme base),则标识符+始终引用标准加法例程(除了在本地被 遮蔽的区域lambda, let, let*,或者当然,您有什么)。

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

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