typestar

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

  1. repeat toma &body body y se expande en un dotimes que lo envuelve.
  2. gensym aporta un nombre de contador fresco para que la expansión no capture una variable de quien llama.
  3. La comilla inversa cita la plantilla, ,times inserta un valor y ,@body empalma las formas.

Palabras clave y builtins usados aquí

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.

Escribe este fragmento

Paso 2 de 3 en Format y macros; paso 23 de 27 en Fundamentos del lenguaje.

← Anterior Siguiente →