10.4 反引号

反引号构造(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 自求值形式


emacs

Emacs

org-mode

Orgmode

Donations

打赏

Copyright

© 2025 Jasper Hsu

Creative Commons

Creative Commons

Attribute

Attribute

Noncommercial

Noncommercial

Share Alike

Share Alike