Una macro anafórica es un tipo de macro de programación que captura deliberadamente alguna forma proporcionada a la macro a la que se puede hacer referencia mediante una anáfora (una expresión que se refiere a otra). Macros anafóricos apareció por primera vez en Paul Graham 's En Lisp [1] y su nombre es una referencia a la anáfora lingüística [1] : uso de palabras como sustituto de la anterior palabras.
Ejemplos de
La loop
macro en ANSI Common Lisp es anafórica al vincularse it
al resultado de la expresión de prueba en una cláusula. [2] [3]
Aquí hay un ejemplo que suma el valor de los no nil
elementos, donde se it
refiere a los valores de los elementos que no son iguales nil
:
( Bucle de elemento en ' ( nil 1 nil 2 nil nil 3 4 6 ) cuando el elemento suma que ) ;; ⇒ 16
Aquí it
está vinculado a la salida de (and (> number 3) number)
cuando es verdadero, recolectando números mayores que 3: [4]
( Bucle de número a partir de 1 a 6 cuando ( y ( > número 3 ) número ) recoger él ) ; 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 de la construcción if-then-else , que introduce una anáfora it
, ligada al resultado de la cláusula de prueba: [5]
( Defmacro FIA ( prueba de forma luego-formado y opcional en forma de otra cosa ) ` ( dejar que (( que , prueba de forma )) ( si es que , a continuación, forma , otra forma ))) ( aif ( + 2 7 ) ( formato nil "~ A no es igual a NIL." it ) ( formato nil "~ A es igual a NIL." it )) ;; ⇒ "9 no es igual a NIL".
Otro ejemplo es una versión anafórica de la función λ , que une la función en sí a la anáfora self
, lo que permite que se repita : [5]
( defmacro alambda ( parms y body body ) ` ( etiquetas (( self , parms , @ body )) # ' 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 )))))
Ver también
Referencias
- ^ a b Capítulo 6 de Let over Lambda
- ^ 22. BUCLE para cinturones negros de Practical Common Lisp
- ^ ¿Cuál sería un ejemplo de un condicional anafórico en Lisp? en StackOverflow
- ^ 6.1.8.1 Ejemplos de agrupación de cláusulas de Common Lisp HyperSpec
- ^ a b Capítulo 14. Macros anafóricas Archivado el 26 de abril de 2012 en la Wayback Machine de On Lisp por Paul Graham
enlaces externos
- Capítulo 14. Macros anafóricas de On Lisp por Paul Graham
- Anaphora : una macrocolección anafórica