如何循环所有导入键?

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