defmacro en Lisp
Una macro reescribe el fuente en otro fuente antes de que se evalúe nada de él.
;; A macro rewrites source before evaluation; backquote builds the new form.
(defmacro repeat (times &body body)
"Evaluate BODY TIMES times and return nil."
(let ((counter (gensym "COUNT")))
`(dotimes (,counter ,times)
(declare (ignorable ,counter))
,@body)))
(defvar *ticks* 0)
(repeat 3
(incf *ticks*)
(format t "tick ~d~%" *ticks*))
(format t "expansion: ~s~%" (macroexpand-1 '(repeat 2 (chime))))
Cómo funciona
repeattoma&body bodyy se expande en undotimesque lo envuelve.gensymaporta un nombre de contador fresco para que la expansión no capture una variable de quien llama.- La comilla inversa cita la plantilla,
,timesinserta un valor y,@bodyempalma las formas.
Palabras clave y builtins usados aquí
declaredefmacrodefvardotimesformatgensymignorableincflet
El intento, en números
- Líneas
- 16
- Caracteres a escribir
- 404
- Tokens
- 78
- Ritmo de tres estrellas
- 70 tpm
Al ritmo de tres estrellas de 70 tokens por minuto, este intento toma unos 67 segundos.
Paso 2 de 3 en Format y macros; paso 23 de 27 en Fundamentos del lenguaje.