10.4 Обратный апостроф

Конструкции с обратным апострофом позволяют цитировать список, но выборочно вычислять элементы этого списка. В простейшем случае это идентично специальной форме quote (описанной в предыдущем разделе; см. Цитирование). Например, эти две формы дают одинаковый результат:

`(a list of (+ 2 3) elements)
     ⇒ (a list of (+ 2 3) elements)
'(a list of (+ 2 3) elements)
     ⇒ (a list of (+ 2 3) elements)

Специальный маркер ‘,’ внутри аргумента обратного апострофа указывает на значение, которое не является константой. Вычислитель Emacs Lisp вычисляет аргумент ‘,’ и помещает значение в структуру списка:

`(a list of ,(+ 2 3) elements)
     ⇒ (a list of 5 elements)

Подстановка с помощью ‘,’ разрешена и на более глубоких уровнях структуры списка. Например:

`(1 2 (3 ,(+ 4 5)))
     ⇒ (1 2 (3 9))

Вы также можете вставлять вычисленное значение в результирующий список, используя специальный маркер ‘,@’. Элементы вставляемого списка становятся элементами того же уровня, что и остальные элементы результирующего списка. Эквивалентный код без использования ‘`’ часто трудночитаем. Вот несколько примеров:

(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)

Если подвыражение конструкции с обратным апострофом не содержит подстановок или вставок, оно действует как quote в том смысле, что порождает точечные пары, векторы и строки, которые могут быть разделяемыми и не должны изменяться. См. Самовычисляющиеся формы.