関数のインポートって

正確には関数を示すシンボルのインポートだけれど、これを行うと、インポート先で関数を再定義すると、エクスポート元の関数まで上書きされてしまう。
実際、こういう動作をしたい場合もあるかも知れないが、普通は行わない。

また、インポートした後で定義が変更された場合(行儀の悪いパッケージが前記の操作をする等)にも影響を受けてしまうが、これも普通は避けたい。

従って、下のようなマクロを使って、中身の関数だけコピーするのが本当に必要な動作である気がする。

(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)))))))