Let's write β

プログラミング中にできたことか、思ったこととか

Defpackage with closer-mop

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に展開されます。