反引号构造(Backquote constructs) 允许你对一个列表进行引用,同时有选择地对列表中的部分元素求值。在最简单的情况下,它和特殊形式
quote
的作用完全相同(上一节已介绍;see 引用。
例如,下面这两种形式会产生完全相同的结果:
`(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))
你也可以使用特殊标记 ‘,@’,将一个已求值的结果 拼接(splice) 到最终生成的列表中。被拼接列表的元素会成为最终列表中与其他元素同一层级的元素。如果不使用 ‘`’,实现同等功能的代码往往难以阅读。以下是一些示例:
(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:生成的 cons 单元、向量和字符串可能会被共享,因此不应该被修改。
See 自求值形式。