Macros en Emacs Lisp: la belleza de programas que escriben programas

Fuentes: Gödel, Escher, Elisp: The Beauty of Macros

Las macros de Emacs Lisp son piezas de código que reciben formas sin evaluar y devuelven código nuevo, transformándose en pequeños programas que escriben otros programas. Operan en tiempo de expansión, antes de que el programa principal se ejecute, y permiten extender el lenguaje sin tocar el intérprete. Su potencia se apoya en una propiedad central de Elisp: la homoiconicidad, es decir, el código se representa con las mismas estructuras de datos que manipula el lenguaje (listas, símbolos, números y cadenas). Una función normal recibe valores ya calculados en tiempo de ejecución; una macro, en cambio, recibe el código crudo y decide qué se evalúa y qué no, lo que la hace ideal para definir estructuras de control y lenguajes específicos dentro de Elisp.

El artículo, publicado en un blog técnico, recorre esta idea con un enfoque divulgativo. Parte de la diferencia entre programa y datos, ilustrada con la cita de Hofstadter y la famosa tira de Möbius II de Escher, donde dos superficies aparentemente distintas resultan ser una sola. Después, muestra una macro mínima (defmacro my-unless) que reimplementa unless con quasiquotación, explica por qué no puede sustituirse por una función (la evaluación temprana de los argumentos) y demuestra cómo macroexpand-1 revela la transformación. Repasa además macros ya integradas en el ecosistema Emacs —when, unless, dolist, dotimes, push, pop, setf, with-current-buffer, ignore-errors, defun e use-package— y pone énfasis en use-package como compilador de un pequeño lenguaje de configuración declarativa. El texto cierra anunciando secciones adicionales sobre bucles extraños, herramientas de inspección (macroexpand, emacs-lisp-macroexpand, macrostep) y el lado oscuro de las macros: su capacidad para ocultar dependencias, romper la coherencia del código y dificultar el razonamiento estático.