如何循环所有导入键?
How to loop all import-from keys?
(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)
会做你想做的。
(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)
会做你想做的。