月知录

跳转到正文(jump to main content)

Elisp中的quote和backquote

Table of Contents

Elisp中有三种引用结构: quote , function 以及 backquote

quote

(quote object ) 会按照文本形式返回 object ,不对其进行求值。所以quote的主要用途在于定义常量符号和列表。

(quote (+ 1 2)) ; 对这个表达式求值,会返回下面的结果。

(+ 1 2)

quote的简写形式就是一个单引号字符 ''x 等价于 (quote x)

backquote

backquote 用于引用一个list,但是允许对list的某些元素求值。其最简单的形式等同于 quote 。下面的两个form是等价的:

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

(a list of (+ 2 3) elements)

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

(a list of (+ 2 3) elements)

backquote的简写形式就是一个反引号字符 `

,

特殊标记 , 告诉 backquote ,其后跟随的参数需要求值,结果放到backquote生成的list中。例如:

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

a list of 5 elements

再看另一个例子:

(setq v '(a b c))

`(a list embedding ,v)

a list embedding (a b c)

,@

特殊标记 ,@ 告诉 backquote ,其后跟随的参数需要求值, 求值后生成的list的元素要被提取到跟外围元素同级的位置。 看例子:

(setq v '(v1 v2 v3))
`(a list including values a ,@v and b)

a list including values a v1 v2 v3 and b

需要注意的是, ,@ 后的参数求值后应该是一个list(或者其它自求值的对象,例如数字,字符串,向量等)。

function

(function function-object ) 不对参数 function-object 求值,而是直接返回(类似quote)。跟 quote 不同的是,它会告诉Elisp其返回的值是要作为函数使用的。
function 有个简写形式: #' 。下面三种定义匿名函数的方式是等价的:

(lambda (x) x)
(function (lambda (x) x))
#'(lambda (x) x)