Meta Object Protocolを利用したプログラムを記述しようとおもっている時に
パッケージにcloser-mopを(:use)しようとおもっていると、:clや:cl-userとコンフリクトが発生します。
そこでshadowing-import-fromというものを利用してガードします。これを毎回記述するのが面倒なので
自動的にここらへんを挿入してくれるマクロを定義しました
(defmacro defpackage-with-mop (package-name &rest args) (let ((use-form (loop for sexp in args when (equal (car sexp) :use) do (return sexp))) (shadowing-import-form (loop for sexp in args when (equal (car sexp) :shadowing-import-from) do (return sexp))) (rest-forms (loop for sexp in args when (not (or (equal (car sexp) :use) (equal (car sexp) :shadowing-import-from))) collect sexp))) `(defpackage ,package-name (:use :closer-mop ,@(cdr use-form)) (:shadowing-import-from :closer-mop :defclass :defmethod :standard-class :ensure-generic-function :defgeneric :standard-generic-function :class-name ,@(cdr shadowing-import-form)) ,@rest-forms)))
これで自動的にcloser-mopをインポートし:useや:shadowing-import-fromが指定されていたらマージして
defpackageに展開されます。