0

System-A 和 System-B 是使用 ASDF 制作的系统。它们都在.asd文件中具有系统定义并分别定义包:system-a:system-b

我希望 System-A 到:useSystem-B 的包在其包定义中。我想要这个,以便我可以在 System-A 中使用 System-B 的符号,而无需参考 System-B 的包。具体来说,我想使用symbol而不是system-b:symbol.

目前,在 System-A 的包定义中,我正在尝试:use :system-b. 这适用于我使用 QuickLisp 导入的实习生库,但不适用于我自己的系统。

我怎样才能:use :system-b在 System-A 的包中实习符号?

4

1 回答 1

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 的导出符号。


其次,如果您有很多符号要导出(制作实用程序包),您可以使用以下内容,在此处找到。

(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 ()
    ...))
于 2016-08-29T20:22:48.787 回答