シンボルが外部シンボルか内部シンボルか継承されているかを調べる - lisp-cookbook-ja/common-lisp GitHub Wiki

find-symbolを使うことで、シンボルの状態(外部シンボル/内部シンボル/継承)を調べることができます。 find-symbolinternのように実行すると新たにシンボルが生成されるということはありません。

;; foo パッケージを作成
(defpackage :foo
  (:export :a :b :c))

;; foo::aシンボルの状態を確認
(find-symbol "A" :foo)
;=> FOO:A
;   :EXTERNAL (foo::aは外部シンボル)

;; bar パッケージを作成 (fooの外部シンボルを内部シンボルとして取り込む)
(defpackage :bar
  (:use :foo))

;; bar::aでアクセスできるシンボルの状態を確認
(find-symbol "A" :bar)
;=> FOO:A
;   :INHERITED
;; 応用
;; fooパッケージの外部シンボルをbarに取り込み
;; さらにbarの外部シンボルとしてアクセスできるようにする
(do-symbols (s :foo)
  (multiple-value-bind (sym stat)
                       (find-symbol (string s) :foo)
    (when (eq :external stat)
      (export sym :bar)))) ; パッケージbarを指定してexport

(find-symbol "A" :bar)
;=> FOO:A
;   :EXTERNAL

(eq 'foo:a 'bar:a)
;=> T

議論