stringtranslate.com

Macro anafórica

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.

Ejemplos

La loopmacro en ANSI Common Lisp es anafórica en su enlace, donde la itexpresió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 nilelementos no , donde itse 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í itse 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)                

Definición de macros anafóricas

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

Véase también

Referencias

  1. ^ ab Capítulo 6 de Let over Lambda
  2. ^ 22. LOOP para cinturones negros de Practical Common Lisp
  3. ^¿ Cuál sería un ejemplo de un condicional anafórico en Lisp? en StackOverflow
  4. ^ 6.1.8.1 Ejemplos de agrupación de cláusulas de Common Lisp HyperSpec
  5. ^ ab Capítulo 14. Macros anafóricas Archivado el 26 de abril de 2012 en la Wayback Machine de On Lisp de Paul Graham

Enlaces externos