2

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

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

在报告的第 26/27 页上,它说:

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

这是否意味着在导入绑定的库中确实发生重新定义时只是一个错误?

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

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

4

1 回答 1

5

一般原则是在库中声明的绑定只能在同一个库中可移植地变异。如果一个库的绑定被导入一个程序(或另一个库),它们就不能在那里发生变异。因此,如果程序导入(scheme base),则标识符+始终引用标准添加例程(当然,在它被 局部遮蔽的区域除外lambda, let, let*,或者你有什么)。

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

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

于 2012-11-03T18:00:48.650 回答