私は次のように書きます:
(defmacro with-hooks ((monster method who what) &body body)
(let ((monster-var (gensym))
(method-var (gensym))
(who-var (gensym))
(what-var (gensym)))
`(let ((,monster-var ,monster) ; dummy comment
(,method-var ,method)
(,who-var ,who)
(,what-var ,what))
(add-hook ,monster-var ,method-var ,who-var ,what-var)
(unwind-protect
(progn ,@body)
(remove-hook ,monster-var ,method-var ,who-var)))))
いくつかのメモ:
something-var
monster
、method
、who
、what
の式が 1 回だけ評価され (これらの式はマクロ本体で複数回参照されるため)、左から右の順序で評価されるようにするために s が使用されます。
gensym
s は、変数が一意の名前を保証するようにするために使用されます
- unwind-protect は、ローカル以外の終了の場合でも確実に
remove-hook
呼び出されるようにするために使用されます (たとえば、例外がスローされたためにスタックがアンワインドされます)。