如何循环所有从密钥导入


(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)会做你想做的事。

相关内容

  • 没有找到相关文章

最新更新