PREV UP NEXT GNU Emacs Lisp Reference Manual

12.5: Backquote

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)
Before Emacs version 19.29, ` used a different syntax which required an extra level of parentheses around the entire backquote construct. Likewise, each , or ,@ substition required an extra level of parentheses surrounding both the , or ,@ and the following expression. The old syntax required whitespace between the `, , or ,@ and the following expression. This syntax is still accepted, but no longer recommended except for compatibility with old Emacs versions.