我正在研究有关算法语言方案的修订 7 报告。我的问题在5.6节图书馆。
在本节中,它说:
加载库时,其表达式按文本顺序执行。如果在程序或库主体的扩展形式中引用库的定义,则必须在评估扩展的程序或库主体之前加载该库。此规则适用于传递。如果库由多个程序或库导入,则可能会加载额外的时间。
这是什么意思?仅当实际引用了导入的标识符时,或者当库是扩展程序或库的导入集的一部分时,是否意味着库已加载?如果同一个程序导入的另外两个库引用了同一个库,那么库是加载两次还是只加载一次?
由于库的加载可能会因为表达式的执行而产生副作用,因此这些问题的答案对我来说似乎很重要。另外,请分享导入第三个库的内部全局变量的两个库吗?
我已经用chibi-scheme完成了一些实验:每个程序,chibi-scheme只加载每个库一次,即使它实际上没有引用任何导出的标识符。事实上,这看起来对我来说是一个明智且容易实现的事情。
P.S。:还有另外一点,我认为规范有点模糊:如果在程序中导入集导入名为import
的标识符,会发生什么?这是否意味着紧接的后续行(import ...)
被解释为命令或定义(取决于导入的标识符import
代表什么)或仍然作为导入集?
P.P.S。:在顶级计划中允许多个进口申报的原因是什么?
答案 0 :(得分:1)
让我尝试一次一个地回答你的每个问题。此外,如果它有帮助,here是用于在chibi方案中实现库的元语言的链接。
<小时/> 通过
import
语句导入库时会加载库。
如果在程序或库主体的扩展形式中引用了库的定义,则必须在评估扩展的程序或库主体之前加载该库。
这只是意味着必须在引用其定义之前加载库(或者它将是一个错误,因为找不到定义)。
如果某个库是由多个程序或库导入的,则可能会多次加载它。
这是依赖于实现的,因此您的库代码不应假设它只会被加载一次。
如果在程序中导入集导入名为import?
的标识符,会发生什么情况
最有可能的是,新的import
标识符会影响或替换import
,因此同一范围内的任何import
语句将无法按预期工作。这可能是依赖于实现的 - 如果将import
实现为特殊形式,则不会被新引入的标识符覆盖。