Anaphoric macroAn 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[1] and their name is a reference to linguistic anaphora[1]—the use of words as a substitute for preceding words. ExamplesThe Here is an example that sums the value of non- (loop for element in '(nil 1 nil 2 nil nil 3 4 6)
when element sum it)
;; ⇒ 16
Here (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 macrosOne example is an anaphoric version of the if-then-else construct, which introduces an anaphor (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 (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
References
External linksThe Wikibook Common Lisp has a page on the topic of: Anaphoric macros with Anaphora
|
Portal di Ensiklopedia Dunia