5

(with-hooks (monster method who what) &body body)私が書いているゲームのマクロを書く必要があります。Monster は CLOS オブジェクト、メソッド、誰が文字列、何が関数 (#' 表記) です。マクロ拡張は、

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

このようなマクロの書き方がまったくわからないので、助けていただければ幸いです。これは簡単で、少し無知な気がします。

4

1 に答える 1

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

いくつかのメモ:

  1. something-varmonstermethodwhowhatの式が 1 回だけ評価され (これらの式はマクロ本体で複数回参照されるため)、左から右の順序で評価されるようにするために s が使用されます。
  2. gensyms は、変数が一意の名前を保証するようにするために使用されます
  3. unwind-protect は、ローカル以外の終了の場合でも確実にremove-hook呼び出されるようにするために使用されます (たとえば、例外がスローされたためにスタックがアンワインドされます)。
于 2010-05-23T19:01:06.930 に答える