我需要写一个宏 (with-hooks (monster method who what) &body body) 对于我正在写的游戏。怪物是一个关闭的对象,方法和谁是字符串,什么是函数(#'符号)。宏扩展将是

(add-hook monster method who what)
,@body
(remove-hook monster method who)

我有 绝对地 不知道如何编写这样的宏,我很感谢您的帮助。我有令人毛骨悚然的感觉,这很容易,我有点无知。

有帮助吗?

解决方案

我会这样写:

(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)))))

一些注释:

  1. something-varS用于确保表达 monster, method, who, what 仅评估一次(因为这些表达式在宏观主体中多次引用)和从左到右的顺序。
  2. gensymS用于确保变量保证了独特的名称
  3. 松开保护用于确保 remove-hook 即使在非本地出口的情况下也称为(例如,由于抛出例外而放松堆积)。
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top