如何:使用我用ASDF创建的系统?

时间:2016-08-29 17:27:13

标签: architecture lisp common-lisp asdf

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的包中实习符号?

1 个答案:

答案 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 ()
    ...))