(defpackage #:my-test-package
(:use #:common-lisp
#:my-test-runner)
(:import-from #:my-package
#:name
#:path
#:system-path
#:something
#:more-something
#:and-more-something))
问题是,例如,:my-test-package
也使用:name
和:path
,我需要两者,所以我导入了我需要的所有内容,但一直记住这一点很无聊,而且我需要测试my-package
中没有导出的东西,我不想一直使用my-package::<something>
,所以,如何在:import-from #:my-package <...>
中循环my-package
的所有(导出或不导出(键,而不需要手动导入?
如果您想简单地使用my-package
的所有导出符号,那么使用包:
(defpackage #:my-test-package
(:use
#:common-lisp
#:my-test-runner
#:my-package))
如果你想要主包是my-package
的所有符号,并且你想要导入它们(这样它们就直接存在于my-test-package
中,而不仅仅是可以从中访问(,那么你想要这样的东西:
(eval-when (:load-toplevel :compile-toplevel :execute)
(defun package-symbols (p)
"All the symbols accessible in P whose home package is P"
(let ((ints '()))
(do-symbols (s p ints)
(when (eq (symbol-package s) p)
(push s ints)))))
(defmacro define-test-package (package &body importing)
`(defpackage ,package
(:use
#:common-lisp #:my-test-runner)
,@(mapcar (lambda (i)
`(:import-from
,i
,@(package-symbols (find-package i))))
importing)))
然后(define-test-package #:my-test-package #:my-package)
会做你想做的事。