我正在研究关于算法语言方案的修订版 7 报告。我的问题是关于第 5.6 节库。
在本节中,它说:
When a library is loaded, its expressions are executed in textual order. If a library's definitions are referenced in the expanded form of a program or library body, then that library must be loaded before the expanded program or library body is evaluated. This rule applies transitively. If a library is imported by more than one program or library, it may possibly be loaded additional times.
这是什么意思?这是否意味着仅当导入的标识符实际被引用或已经被引用时才加载库,当该库是扩展程序或库的导入集的一部分时?如果同一个库被同一个程序导入的另外两个库引用,这个库是加载了两次还是只加载了一次?
由于库的加载可能会由于其表达式的执行而产生副作用,因此这些问题的答案对我来说似乎很重要。另外,是否共享导入第三个库的两个库的内部全局变量?
我对 chibi-scheme 做了一些实验:每个程序,chibi-scheme 只加载每个库一次,即使实际上没有引用它的导出标识符。事实上,对我来说,这看起来是一件明智且易于实现的事情。
P.S.:还有一点我认为规范有点含糊:如果在程序中,导入集导入名为
import
的标识符会发生什么?这是否意味着紧随其后的行 (import ...)
被解释为命令或定义(取决于导入的标识符 import
代表什么)还是仍然作为导入集?P.P.S.:在顶级程序中允许多个导入声明的原因是什么?
最佳答案
让我尝试一次回答您的每个问题。另外,如果有帮助,here是用于在赤壁方案中实现库的元语言的链接。
库在通过 import
导入时被加载陈述。
If a library's definitions are referenced in the expanded form of a program or library body, then that library must be loaded before the expanded program or library body is evaluated.
这只是意味着必须在引用其定义之前加载库(否则会出错,因为找不到定义)。
If a library is imported by more than one program or library, it may possibly be loaded additional times.
这是依赖于实现的,所以你的库代码不应该假设它只会被加载一次。
What happens if, in a program, an import set imports an identifier named import?
最有可能的是新
import
标识符将隐藏或替换 import
, 使任何 import
同一范围内的语句将不再按预期工作。这可能取决于实现 - 如果 import
被实现为一种特殊形式,那么它不会被新引入的标识符覆盖。
关于module - Scheme库被*加载*意味着什么? Scheme库什么时候*加载*?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21237553/