2010-05-23 11 views
5

Necesito escribir una macro (with-hooks (monster method who what) &body body) para un juego que estoy escribiendo. Monster es un objeto CLOS, método y quiénes son cadenas y qué es una función (notación #). El macroexpansion sería algo en el sentido deCómo escribir macro (simple)?

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

tengo absolutamente ni idea de cómo escribir una macro tal, y yo agradecería un poco de ayuda. Tengo la escalofriante sensación de que esto es fácil y que soy un poco ignorante.

Respuesta

10

me gustaría escribir así:

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

Algunas notas:

  1. something-var s se utilizan para garantizar que las expresiones de monster, method, who, what son evaluados solamente una vez (porque estas expresiones se referencian varias veces en el cuerpo de la macro) y en orden de izquierda a derecha.
  2. gensym s se utilizan para asegurar que las variables han garantizado nombres únicos
  3. desenrollado-a proteger se utiliza para asegurar que remove-hook se llama incluso en caso de salidas no locales (por ejemplo, apilar descansar debido a excepción siendo lanzada).
+2

gracioso, yo había escrito el mismo código casi línea por línea –

+0

Gracias. Estoy trabajando en un juego roguelike de GPL llamado Menace of the Mines (http://motm.sourceforge.net) y solo quiero asegurarme de que este estar ahí esté bien contigo. (Tengo un comentario de atribución (Ha estado allí por un tiempo)) – krzysz00

+0

No me importa si incluye esta macro en cualquier proyecto de alguna manera. –

Cuestiones relacionadas