在带有ASDF的Common Lisp中,uiop/package
中的define-package
和defpackage
宏有什么区别?
UIOP的子句有更多子句。
https://common-lisp.net/project/asdf/uiop.html#UIOP_002fPACKAGE
Define-Package 支持以下关键字:use、shadowing、shadowing-import-from、import-from、export、intern -- 根据 cl:defpackage。
这些是相同的。但是文档字符串的其余部分引入了更多它们:recycle
、mix
、reexport
......
我使用了reexport
,这使得以下内容更容易:您不想完全use
包 A(例如,亚历山大)。您想导入几个符号(简单,带import-from
),并且还想导出它们(也很容易,带export
)。但是在这样做时,你必须写两次符号。reexport
可节省重复。
我听到一些抱怨说defpackage在某些情况下无法重新加载包,并且定义包工作正常,但我没有遇到这种情况。
(编辑):另一个区别:假设您在defpackage
定义中":use"了一个包。现在,擦除该行并再次编译包定义。您的 Lisp 会给您一个警告,告诉您的软件包"也使用以下软件包",并列出您从定义中删除的软件包。您删除了该行,但包仍"使用"您要删除的内容。您可以与(describe (find-package :my-package))
.
对 UIOP 的define-package
做同样的事情:你没有警告,你的包不再像预期的那样"使用"你从定义中删除的包。