System-A和System-B是使用ASDF制作的系统。它们都在:system-a
个文件中有系统定义,并分别定义包:system-b
和:use
。
我希望System-A在其包定义中包含symbol
System-B的包。我希望这样,以便我可以在System-A中使用System-B的符号,而无需参考System-B的软件包。具体来说,我想使用system-b:symbol
而不是:use :system-b
。
目前,在System-A的软件包定义中,我正在尝试:use :system-b
。这适用于我使用QuickLisp导入的实习库,但不适用于我自己的系统。
我如何-javaagent:c:/dev/jacoco/jacocoagent.jar=destfile=c:/dev/jacoco.exec
以便我在System-A的包中实习符号?
答案 0 :(得分:0)
在这里,我将展示我找到的解决方案:
第一种是导出包定义中的符号。使用我的例子,在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 ()
...))