小技 - lisp-cookbook-ja/common-lisp GitHub Wiki

** macroletの展開を確認したい

(macrolet ((def ()
               `(progn
                  ,@(mapcar (lambda (c)
                              (let ((class-name (class-name (find-class c))))
                                `(defmethod zot ((obj ,class-name))
                                   (format nil
                                           ,(format nil
                                                    "~~A => ~:(~A~)"
                                                    class-name)
                                           obj ))))
                            *classes* ))))
  (def) )

のようなローカルマクロの展開を確認したいとします。場合によっては、SLIMEなどで展開を確認できたりもしますが、うまく展開されないこともあります。

こういう場合先頭にquoteを付けリストとして出力してみるのも一つの手です。

(macrolet ((def ()
               '`(progn ;<- 先頭にquoteをつける
                   ,@(mapcar (lambda (c)
                               (let ((class-name (class-name (find-class c))))
                                 `(defmethod zot ((obj ,class-name))
                                    (format nil
                                            ,(format nil
                                                     "~~A => ~:(~A~)"
                                                     class-name )
                                            obj ))))
                             *classes* ))))
  (def) )
;=>  (PROGN
;      (DEFMETHOD ZOT ((OBJ CONS)) (FORMAT NIL "~A => Cons" OBJ))
;      (DEFMETHOD ZOT ((OBJ NUMBER)) (FORMAT NIL "~A => Number" OBJ))
;      (DEFMETHOD ZOT ((OBJ INTEGER)) (FORMAT NIL "~A => Integer" OBJ))
;      (DEFMETHOD ZOT ((OBJ LIST)) (FORMAT NIL "~A => List" OBJ))
;      (DEFMETHOD ZOT ((OBJ NULL)) (FORMAT NIL "~A => Null" OBJ))
;      (DEFMETHOD ZOT ((OBJ STRING)) (FORMAT NIL "~A => String" OBJ))
;      (DEFMETHOD ZOT ((OBJ SYMBOL)) (FORMAT NIL "~A => Symbol" OBJ))
;      (DEFMETHOD ZOT ((OBJ VECTOR)) (FORMAT NIL "~A => Vector" OBJ)))