小技 - 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)))