define-library
是否允许兼容的 R7RS-small 实现对每个文件的数量施加限制?一些 R7RS-small 实现,例如 Guile 3.0.7 define-library
,每个文件只允许一个。这是与标准的偏差,还是 R7RS-small 允许的?
2 回答
是的,我认为他们可以(也许应该)。
如果您查看当时的正式语法和r7rs.pdf
语义
- 程序是一个或多个导入声明,后跟一个或多个命令或定义。命令和定义不包括
define-library
. - 图书馆正是一种
define-library
形式。
因此,您可以得出结论,一个程序不包含define-library
表单,而一个库恰好包含一个这样的表单。
现在该文档根本没有说明所有这些如何映射到文件中,因此由实现来定义它。我认为一个实现完全有可能说文件到库文件的映射应该是 1-1,因此任何给定的库文件都只包含一个库。当然,也有可能包含包含程序和一个或多个库的混合文件。
在库位于它们自己的文件中的情况下(这显然是允许重用的更有趣的情况),必须将库名称转换为文件。这样就可以很自然地在每个文件中放置一个库。
如果是我,我会允许包含程序和一个或多个库的混合文件直接存在,但对于只是库的文件,我会允许每个文件中只有一个。
在 R7RSdefine-library
中只是一种形式,类似于library
在 R6RS 中。在这两种情况下,我都看不到任何符合要求的实现可能会限制文件只包含一种这样的形式。
但是 Guile 文档对此事有话要说。在7.7 R7RS 支持中:
令人高兴的是,R7RS 模块的语法被选择为与 R6RS 兼容,因此 Guile 的文档在那里适用。
由于 R7RS 是一个远没有 R6RS 雄心勃勃的标准(参见 Guile 和 Scheme),所以 Guile 很容易支持。因此,Guile 是一个完全符合 R7RS 的实现,除了偶尔出现的错误和一些未实现的功能......
library
尚不支持在一个文件中包含多个表单。这是因为扩展library
设置了当前模块,但不恢复它。这是一个错误。