関数のインポートって
正確には関数を示すシンボルのインポートだけれど、これを行うと、インポート先で関数を再定義すると、エクスポート元の関数まで上書きされてしまう。
実際、こういう動作をしたい場合もあるかも知れないが、普通は行わない。
また、インポートした後で定義が変更された場合(行儀の悪いパッケージが前記の操作をする等)にも影響を受けてしまうが、これも普通は避けたい。
従って、下のようなマクロを使って、中身の関数だけコピーするのが本当に必要な動作である気がする。
(defmacro function-load (names from-package) (let ((fp (gensym))) (flet ((f (x) `(setf (symbol-function (intern (symbol-name ',x))) (symbol-function (intern (symbol-name ',x) ,fp))))) (when (and (consp names) (eq 'quote (car names))) (setf names (cadr names))) `(let ((,fp ,from-package)) ,(if (atom names) (f names) (list* 'progn (mapcar #'f names)))))))