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)