我已经阅读了当前的即将推出的R7RS计划标准(小型语言)草案,但我不明白在哪些条件下重新定义顶级绑定不是错误。
我想这是可能的定义或设置!第二次在程序的顶层引入的绑定。但是如何从外部库导入绑定呢?是否可以通过标准覆盖这些绑定?
报告第26/27页说:
程序的顶层也可能包括导入声明。在库声明中,使用不同的绑定多次导入相同的标识符,或者使用定义、定义-语法或set重新定义或修改导入的绑定,都是错误的。然而,REPL应该允许这些操作。
这是否意味着只有在导入绑定的库中发生重新定义时才是错误?
据我所知,如果编译器不知道(例如+)是否表示生成的附加错误或其他用户指定的错误,则禁止编译器进行优化。但是从这个角度来看,限制禁止在库级别上重新绑定是没有意义的,因为在程序中导入绑定(至少)也是有意义的。
P.S.:因为这都是关于一个计划项目的环境:我说的环境不是一流的公民,因为一个人无法控制当前的环境,对吗?(这反过来允许编译的程序忘记所选绑定的名称。)
发布于 2012-11-03 18:00:48
一般原则是,在库中声明的绑定只能在同一个库中进行可移植的变异。如果一个库的绑定被导入到一个程序(或另一个库)中,那么它们就不能在那里发生变异。因此,如果程序导入(scheme base),标识符+总是引用标准的加法例程(当然,在一个由lambda, let, let*在本地隐藏的区域除外,或者您有什么)。
在REPL或由REPL执行的脚本中,此限制不适用。此外,实现还可以通过取消限制来扩展标准语言。
与当前全局环境最接近的是(interaction-environment)的结果,如果有,它表示REPL的可变环境。如果REPL未使用或不存在,则可以通过对与当前导入集相对应的参数调用environment来模拟当前但不可变的环境。R7RS和它的前身一样,没有任何词汇环境的表示形式。
https://stackoverflow.com/questions/12339041
复制相似问题