如何:使用我用 ASDF 创建的系统?
How to :use systems I create with ASDF?
System-A和System-B是使用ASDF制作的系统。它们在 .asd
文件中都有系统定义,并分别定义了包 :system-a
和 :system-b
。
我希望系统 A 在其包定义中 :use
系统 B 的包。我想要这个,这样我就可以在 System-A 中使用 System-B 的符号,而无需参考 System-B 的包。具体来说,我想使用 symbol
而不是 system-b:symbol
。
目前,在 System-A 的包定义中,我正在尝试 :use :system-b
。这适用于我使用 QuickLisp 导入的实习生库,但不适用于我自己的系统。
我如何:use :system-b
才能在 System-A 的包中实习符号?
在这里我将展示我找到的解决方案:
首先是导出包定义中的符号。使用我的示例,在 System-B 的包定义中
(defpackage :system-b
(:use :cl)
(:export :symbol1
:symbol2
...))
并且在 System-A 的包定义中
(defpackage :system-a
(:use :cl
:system-b))
然后,当您 (in-package :system-a)
时,您可以访问 System-B 的导出符号。
其次,如果你有很多符号要导出(制作一个实用程序包),你可以使用下面的方法,发现 here。
(let ((package (find-package :foo)))
(do-all-symbols (symbol package)
(when (eql (symbol-package symbol) package)
(export symbol))))
在所有交易品种创建完成后放置这段代码。如果使用 ASDF,在您的系统定义中,您可以让最后加载的文件包含这些行以导出所有符号,而无需手动定义它们。
导出符号的第三个选项是 cl-annot,它允许您在函数前加上前缀 @export
以导出它。例如,
@export
(defun foobar ()
...)
相当于
(progn
(export 'foobar)
(defun foobar ()
...))
System-A和System-B是使用ASDF制作的系统。它们在 .asd
文件中都有系统定义,并分别定义了包 :system-a
和 :system-b
。
我希望系统 A 在其包定义中 :use
系统 B 的包。我想要这个,这样我就可以在 System-A 中使用 System-B 的符号,而无需参考 System-B 的包。具体来说,我想使用 symbol
而不是 system-b:symbol
。
目前,在 System-A 的包定义中,我正在尝试 :use :system-b
。这适用于我使用 QuickLisp 导入的实习生库,但不适用于我自己的系统。
我如何:use :system-b
才能在 System-A 的包中实习符号?
在这里我将展示我找到的解决方案:
首先是导出包定义中的符号。使用我的示例,在 System-B 的包定义中
(defpackage :system-b
(:use :cl)
(:export :symbol1
:symbol2
...))
并且在 System-A 的包定义中
(defpackage :system-a
(:use :cl
:system-b))
然后,当您 (in-package :system-a)
时,您可以访问 System-B 的导出符号。
其次,如果你有很多符号要导出(制作一个实用程序包),你可以使用下面的方法,发现 here。
(let ((package (find-package :foo)))
(do-all-symbols (symbol package)
(when (eql (symbol-package symbol) package)
(export symbol))))
在所有交易品种创建完成后放置这段代码。如果使用 ASDF,在您的系统定义中,您可以让最后加载的文件包含这些行以导出所有符号,而无需手动定义它们。
导出符号的第三个选项是 cl-annot,它允许您在函数前加上前缀 @export
以导出它。例如,
@export
(defun foobar ()
...)
相当于
(progn
(export 'foobar)
(defun foobar ()
...))