An anaphoric macro is a type of
programming macro that deliberately captures some form supplied to the macro which may be referred to by an ''anaphor'' (an expression referring to another). Anaphoric macros first appeared in
Paul Graham's ''
On Lisp''
[Chapter 6](_blank)
of Let over Lambda
Let or LET may refer to:
Sports
* Let serve, when the served object in certain racket sports hits the net and lands in the correct service court, such as;
** Let (badminton)
** Let (pickleball)
** Let (tennis)
* Ladies European Tour, the ladie ...
and their name is a reference to
linguistic anaphora—the use of words as a substitute for preceding words.
Examples
The
loop
macro in
ANSI Common Lisp is anaphoric in binding, where the
it
expression refers to the result of the test expression in a clause.
Here is an example that sums the value of non-
nil
elements, where
it
refers to the values of elements that do not equal
nil
:
(loop for element in '(nil 1 nil 2 nil nil 3 4 6)
when element sum it)
;; ⇒ 16
Here
it
is bound to the output of
(and (> number 3) number)
when true, collecting numbers larger than 3:
6.1.8.1 Examples of clause grouping
from the Common Lisp HyperSpec
(loop for number from 1 to 6
when (and (> number 3) number)
collect it) ; IT refers to (and (> number 3) number).
;; ⇒ (4 5 6)
Defining anaphoric macros
One example is an anaphoric version of the if-then-else construct, which introduces an ''anaphor'' it
, bound to the result of the test clause:[Chapter 14. Anaphoric Macros](_blank)
of On Lisp by Paul Graham
(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."
Another example is an anaphoric version of the λ-function, which binds the function itself to the ''anaphor'' self
, allowing it to recur:
(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)))))
See also
* Anonymous recursion
* Hygienic macros
* Macro (computer science)
* Method chaining
* this (computer programming)
References
External links
{{wikibooks, Common Lisp, External libraries/Extended Binding#Anaphoric macros with Anaphora, Anaphoric macros with Anaphora
Chapter 14. Anaphoric Macros
from On Lisp by Paul Graham
Anaphora
— an anaphoric macro collection
Lisp (programming language)
Programming constructs
Source code
Articles with example Lisp (programming language) code