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

Scheme 什么时候可以覆盖(R7RS)方案中的顶级绑定?,scheme,r7rs,Scheme,R7rs,我已经阅读了当前的草案,但我不明白在什么情况下重新定义顶级绑定不是错误的 我想这是可能的定义或设置!第二次在程序顶层引入的绑定。但是从外部库导入的绑定呢?是否可以通过标准覆盖这些绑定 报告第26/27页说: 程序的顶层还可能包括导入声明。 在库声明中,导入是错误的 使用不同绑定多次使用同一标识符, 或者使用define重新定义或修改导入的绑定, 定义语法或集合!。但是,REPL应该允许 这些行动 这是否意味着重新定义只是在导入绑定的库中发生的错误 我理解,如果编译器不知道(比如+)是否仍然意味着

我已经阅读了当前的草案,但我不明白在什么情况下重新定义顶级绑定不是错误的

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

报告第26/27页说:

程序的顶层还可能包括导入声明。 在库声明中,导入是错误的 使用不同绑定多次使用同一标识符, 或者使用define重新定义或修改导入的绑定, 定义语法或集合!。但是,REPL应该允许 这些行动

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

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


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

一般原则是,在库中声明的绑定只能在同一库中进行可移植的变异。如果一个库的绑定被导入到一个程序或另一个库中,它们就不能在那里进行变异。因此,如果一个程序导入scheme base,标识符+总是指标准的加法例程,除非在一个区域中它被lambda、let、let*或你所拥有的东西局部遮蔽

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


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

一般原则是,在库中声明的绑定只能在同一库中进行可移植的变异。如果一个库的绑定被导入到一个程序或另一个库中,它们就不能在那里进行变异。因此,如果一个程序导入scheme base,标识符+总是指标准的加法例程,除非在一个区域中它被lambda、let、let*或你所拥有的东西局部遮蔽

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

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