Next: Problems with Macros, Previous: Defining Macros, Up: Macros [Contents][Index]
Macros often need to construct large list structures from a mixture of constants and nonconstant parts. To make this easier, use the macro ‘`’ (often called backquote).
Backquote allows you to quote a list, but selectively evaluate
elements of that list. In the simplest case, it is identical to the
special form quote
(see Quoting). For example, these
two forms yield identical results:
`(a list of (+ 2 3) elements) ⇒ (a list of (+ 2 3) elements)
'(a list of (+ 2 3) elements) ⇒ (a list of (+ 2 3) elements)
The special marker ‘,’ inside of the argument to backquote indicates a value that isn’t constant. Backquote evaluates the argument of ‘,’ and puts the value in the list structure:
(list 'a 'list 'of (+ 2 3) 'elements) ⇒ (a list of 5 elements)
`(a list of ,(+ 2 3) elements) ⇒ (a list of 5 elements)
You can also splice an evaluated value into the resulting list, using the special marker ‘,@’. The elements of the spliced list become elements at the same level as the other elements of the resulting list. The equivalent code without using ‘`’ is often unreadable. Here are some examples:
(setq some-list '(2 3)) ⇒ (2 3)
(cons 1 (append some-list '(4) some-list)) ⇒ (1 2 3 4 2 3)
`(1 ,@some-list 4 ,@some-list) ⇒ (1 2 3 4 2 3)
(setq list '(hack foo bar)) ⇒ (hack foo bar)
(cons 'use (cons 'the (cons 'words (append (cdr list) '(as elements))))) ⇒ (use the words foo bar as elements)
`(use the words ,@(cdr list) as elements) ⇒ (use the words foo bar as elements)
Next: Problems with Macros, Previous: Defining Macros, Up: Macros [Contents][Index]