Una macro anafórica es un tipo de macro de programación que captura deliberadamente alguna forma suministrada a la macro a la que se puede hacer referencia mediante una anáfora (una expresión que hace referencia a otra). Las macros anafóricas aparecieron por primera vez en On Lisp [1] de Paul Graham y su nombre es una referencia a la anáfora lingüística [1] : el uso de palabras como sustituto de palabras anteriores.
La loop
macro en ANSI Common Lisp es anafórica en su enlace, donde la it
expresión se refiere al resultado de la expresión de prueba en una cláusula. [2] [3]
A continuación se muestra un ejemplo que suma el valor de nil
elementos no , donde it
se refiere a los valores de elementos que no son iguales a nil
:
( bucle para el elemento en ' ( nil 1 nil 2 nil nil 3 4 6 ) cuando el elemento suma ) ;; ⇒ 16
Aquí it
se enlaza a la salida (and (> number 3) number)
cuando es verdadero, recopilando números mayores a 3: [4]
( bucle para el número del 1 al 6 cuando ( y ( > número 3 ) número ) lo recogen ) ; IT se refiere a (y (> número 3) número). ;; ⇒ (4 5 6)
Un ejemplo es una versión anafórica del constructo if-then-else , que introduce una anáfora it
, vinculada al resultado de la cláusula de prueba: [5]
( defmacro aif ( forma-de-prueba entonces-forma & opcional forma-de-lo-contrario ) ` ( let (( it , forma-de-prueba )) ( if it , forma-de-lo-contrario , forma-de-lo-contrario ))) ( aif ( + 2 7 ) ( formato nil "~A no es igual a NIL." it ) ( formato nil "~A sí es igual a NIL." it )) ;; ⇒ "9 no es igual a NIL."
Otro ejemplo es una versión anafórica de la función λ , que vincula la función misma a la anáfora self
, lo que le permite repetirse : [5]
( defmacro alambda ( parms &body cuerpo ) ` ( etiquetas (( self , parms ,@ cuerpo )) #' self )) ;; Función factorial definida recursivamente donde `self' se refiere a la función alambda ( alambda ( n ) ( if ( = n 0 ) 1 ( * n ( self ( 1- n )))))