krz*_*z00 5 lisp macros common-lisp clos
我需要为(with-hooks (monster method who what) &body body)我正在编写的游戏编写一个宏.Monster是一个CLOS对象,方法,谁是字符串,什么是函数(#'表示法).宏观扩张将会产生影响
(add-hook monster method who what)
,@body
(remove-hook monster method who)
我完全不知道如何编写这样的宏,我将不胜感激.我有一种令人毛骨悚然的感觉,这很容易,我有点无知.
dmi*_*_vk 10
我写的是这样的:
(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-vars的用于确保为表达式monster,method,who,what仅计算一次(因为这些表达式被引用在宏体多次),并在左到右的顺序.gensyms用于确保变量具有唯一名称remove-hook即使在非本地退出的情况下也会调用(例如,由于异常被抛出而导致堆栈展开).