Elisp中的quote和backquote
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)