请输入您要查询的百科知识:

 

词条 Anaphoric macro
释义

  1. Examples

  2. Defining anaphoric macros

  3. See also

  4. References

  5. External links

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[1] and their name is a reference to linguistic anaphora[1]—the use of words as a substitute for preceding words.

Examples

The loop macro in ANSI Common Lisp is anaphoric in that it binds it to the result of the test expression in a clause.[2][3]

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:[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)

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:[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."

Another example is an anaphoric version of the λ-function, which binds the function itself to the anaphor self, allowing it to recur:[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)))))

See also

  • Anonymous recursion
  • Hygienic macros
  • Macro (computer science)
  • Method chaining
  • this (computer programming)

References

1. ^Chapter 6 of Let over Lambda
2. ^22. LOOP for Black Belts from Practical Common Lisp
3. ^[https://stackoverflow.com/q/3922204/165806 What would be an example of an anaphoric conditional in Lisp?] on StackOverflow
4. ^6.1.8.1 Examples of clause grouping from the Common Lisp HyperSpec
5. ^Chapter 14. Anaphoric Macros {{webarchive |url=https://web.archive.org/web/20120426001111/http://dunsmor.com/lisp/onlisp/onlisp_18.html |date=April 26, 2012 }} of On Lisp by Paul Graham

External links

{{wikibooks|Common Lisp|External libraries/Extended Binding#Anaphoric macros with Anaphora|Anaphoric macros with Anaphora}}
  • [https://web.archive.org/web/20120426001111/http://dunsmor.com/lisp/onlisp/onlisp_18.html Chapter 14. Anaphoric Macros] from On Lisp by Paul Graham
  • Anaphora — an anaphoric macro collection

4 : Lisp (programming language)|Programming constructs|Source code|Articles with example Lisp code

随便看

 

开放百科全书收录14589846条英语、德语、日语等多语种百科知识,基本涵盖了大多数领域的百科知识,是一部内容自由、开放的电子版国际百科全书。

 

Copyright © 2023 OENC.NET All Rights Reserved
京ICP备2021023879号 更新时间:2024/11/14 0:54:42