Анафорический макрос
Анафорический макрос — это тип программного макроса , который намеренно фиксирует некоторую форму, предоставленную макросу, на которую можно ссылаться с помощью анафоры (выражения, ссылающегося на другое). Анафорические макросы впервые появились в Пола Грэма книге On Lisp. [1] и их название является отсылкой к лингвистической анафоре [1] - использование слов в качестве замены предшествующих слов.
Примеры
[ редактировать ]The loop
Макрос в ANSI Common Lisp является анафорическим по привязке, где it
выражение относится к результату тестового выражения в предложении. [2] [3]
Вот пример, который суммирует значение не- nil
элементы, где it
относится к значениям элементов, которые не равны nil
:
(loop for element in '(nil 1 nil 2 nil nil 3 4 6)
when element sum it)
;; ⇒ 16
Здесь it
привязан к выходу (and (> number 3) number)
если true, сбор чисел больше 3: [4]
(loop for number from 1 to 6
when (and (> number 3) number)
collect it) ; IT refers to (and (> number 3) number).
;; ⇒ (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 does not equal NIL." it)
(format nil "~A does equal NIL." it))
;; ⇒ "9 does not equal NIL."
Другой пример — анафорическая версия λ-функции , которая привязывает саму функцию к анафоре. self
, что позволяет ему повторяться : [5]
(defmacro alambda (parms &body body)
`(labels ((self ,parms ,@body))
#'self))
;; Factorial function defined recursively where `self' refers to the alambda function
(alambda (n)
(if (= n 0)
1
(* n (self (1- n)))))
См. также
[ редактировать ]- Анонимная рекурсия
- Гигиенические макросы
- Макро (информатика)
- Цепочка методов
- это (компьютерное программирование)
Ссылки
[ редактировать ]- ^ Перейти обратно: а б Глава 6 Let over Lambda
- ^ 22. LOOP для черных поясов из Practice Common Lisp.
- ^ Каким может быть пример анафорического условия в Лиспе? на StackOverflow
- ^ 6.1.8.1 Примеры группировки предложений из Common Lisp HyperSpec.
- ^ Перейти обратно: а б Глава 14. Анафорические макросы. Архивировано 26 апреля 2012 года в Wayback Machine of On Lisp . Полом Грэмом
Внешние ссылки
[ редактировать ]- Глава 14. Анафорические макросы из On Lisp Пола Грэма
- Анафора — коллекция анафорических макросов