Анафорический макрос — это тип макроса программирования , который намеренно фиксирует некоторую форму, предоставленную макросу, на которую можно сослаться с помощью анафоры (выражения, ссылающегося на другое). Анафорические макросы впервые появились в книге Пола Грэма On Lisp [1] , а их название является отсылкой к лингвистической анафоре [1] — использованию слов в качестве замены предшествующих слов.
Макрос loop
в ANSI Common Lisp является анафорическим по связыванию, где it
выражение ссылается на результат тестового выражения в предложении. [2] [3]
Вот пример, который суммирует значения не- nil
элементов, где it
относится к значениям элементов, которые не равны nil
:
( цикл для элемента в ' ( nil 1 nil 2 nil nil 3 4 6 ) когда элемент суммирует его ) ;; ⇒ 16
Здесь it
привязан к выходным данным (and (> number 3) number)
при значении true, собирая числа больше 3: [4]
( цикл для числа от 1 до 6, когда ( и ( > число 3 ) число ) собирают его ) ; ЭТО относится к (и ( > число 3) числу). ;; ⇒ (4 5 6)
Одним из примеров является анафорическая версия конструкции if-then-else , которая вводит анафору it
, привязанную к результату тестового предложения: [5]
( defmacro aif ( test-form then-form &optional else-form ) ` ( let (( it , test-form )) ( if it , then-form , else-form ))) ( aif ( + 2 7 ) ( format nil "~A не равно NIL." it ) ( format nil "~A равно NIL." it )) ;; ⇒ "9 не равно NIL."
Другим примером является анафорическая версия λ-функции , которая связывает саму функцию с анафором self
, позволяя ей повторяться : [5]
( defmacro alambda ( parms &body body ) ` ( labels (( self , parms ,@ body )) #' self )) ;; Факториальная функция определена рекурсивно, где `self' относится к аламбда-функции ( alambda ( n ) ( if ( = n 0 ) 1 ( * n ( self ( 1- n )))))