我正在研究修订的 7 关于算法语言方案的报告。我的问题是在第5.6节中。
在本节中,它说:
加载库时,其表达式将按文本顺序执行。如果图书馆的定义是以程序或图书馆主体的扩展形式引用的,则必须在评估扩展的程序或库主体之前加载该库。该规则适用。如果库是由多个程序或库导入的,则可能会加载其他时间。
这应该是什么意思?这是否意味着仅在实际引用导入标识符的情况下,或者当库是扩展程序或库的导入集的一部分时,库是已加载?如果同一程序导入的其他两个库正在引用同一库,则该库是加载两次还是仅一次?
由于库的加载可能由于其表达式执行而具有副作用,因此这些问题的答案对我来说似乎很重要。另外,共享两个库将第三个库导入其内部全局变量?
我已经对Chibi-Scheme进行了一些实验:每个程序,Chibi-Scheme仅加载每个库一次,即使实际上没有引用其导出的标识符。实际上,这对我来说看起来像是明智且易于实现的事情。
p.s。:我认为规范有点模糊的另一点:如果在程序中,导入集合导入名为import
的标识符会发生什么?这是否意味着立即关注行(import ...)
被解释为命令或定义(取决于导入的标识符import
代表什么)或仍然为导入集?
P.P.S。:甚至是允许在顶级程序中允许多个导入声明的原因?
让我尝试一次回答您的每个问题。另外,如果有帮助,这里是指向千叶方案实现库的元语言的链接。
通过
import
语句导入库时,将加载库。
如果图书馆的定义是以程序或图书馆主体的扩展形式引用的,则必须在评估扩展的程序或库主体之前加载该库。
这只是意味着必须在引用其定义之前加载库(或者是错误的,因为找不到定义)。
如果库是由多个程序或库导入的,则可能会加载其他时间。
这是取决于实现的,因此您的库代码不应假设仅将其加载一次。
如果在程序中,导入集将导入的标识符import导入?
最有可能的是,新的import
标识符将阴影或替换import
,以使同一范围中的任何import
语句都无法如预期的那样工作。这可能取决于实现 - 如果import
作为特殊表格实现,那么新引入的标识符不会覆盖它。