3

我正在研究关于算法语言方案的修订版7报告。我的问题是关于第 5.6 节库。

在本节中,它说:

加载库时,其表达式按文本顺序执行。如果以程序或库主体的扩展形式引用库的定义,则必须在评估扩展的程序或库主体之前加载该库。该规则可传递地应用。如果一个库被多个程序或库导入,它可能会被加载额外的次数。

这是什么意思?这是否意味着仅当实际引用导入的标识符或已经在库是扩展程序或库的导入集的一部分时才加载库?如果同一个库被同一个程序导入的两个其他库引用,该库是加载两次还是只加载一次?

由于库的加载可能会由于其表达式的执行而产生副作用,这些问题的答案对我来说似乎很重要。另外,是否共享导入第三个库其内部全局变量的两个库?

我用 chibi-scheme 做了一些实验:每个程序,chibi-scheme 只加载每个库一次,即使它的导出标识符都没有被实际引用。事实上,这对我来说似乎是一件明智且易于实施的事情。

PS:还有一点我认为规范有点含糊:如果在程序中,导入集导入了一个名为 的标识符,会发生什么import?这是否意味着紧随其后的行(import ...)被解释为命令或定义(取决于导入的标识符import代表什么)或仍然作为导入集?

PPS:在一个顶级程序中允许多个进口申报的原因是什么?

4

1 回答 1

2

让我尝试一次一个地回答你的每一个问题。此外,如果它有帮助,这里是用于在赤壁方案中实现库的元语言的链接。


import库在通过语句 导入时被加载。


如果以程序或库主体的扩展形式引用库的定义,则必须在评估扩展的程序或库主体之前加载该库。

这只是意味着必须在引用其定义之前加载库(否则将是一个错误,因为找不到定义)。


如果一个库被多个程序或库导入,它可能会被加载额外的次数。

这是依赖于实现的,所以你的库代码不应该假设它只会被加载一次。


如果在一个程序中,一个导入集导入了一个名为 import 的标识符,会发生什么?

最有可能的是,新import标识符将隐藏或替换import,因此同一范围内的任何import语句都将不再按预期工作。这可能是依赖于实现的——如果import以特殊形式实现,那么它不会被新引入的标识符覆盖。

于 2014-01-20T18:34:57.733 回答