在学习 Eamcs Lisp 的时候时发现了一个奇怪的问题,虽然知道解决方案,但却不知道产生这个问题的原因。因此记录下。
在 Emacs 中构造一个列表有三种方式,分别是 list
, quote
和 backquote
。
对于 list
而言比较简单,就是把参数求值后返回一个列表,如 (list 1 2 (+ 3 4))
输出 (1 2 7)
。
对于 backquote
而言,还没有仔细研究,目前只知道可以进行部份求值,如 `(a b ,(+ 3 5))
输出 (a b 8)
。
对于 quote
而言其实更简单,就是不对参数求值然后返回一个列表,如 (quote a b (+ 1 2))
输出 (a b (+ 1 2))
。文档上提到因为这个功能在使用太常用了,所以提供了一个简写的方案就是 '(a b (+ 1 2))
用单引号语法来实现,但是这个语法有一个问题:
'(a b c)
可以正常输出 (a b c)
。按正常逻辑理解 '(quote a b c)
应该输出 (quote a b c)
。但是这个输出并没有遵循这个逻辑,它的输出是 ('a b c)
。这就比较奇怪了,按理说单引号内的所有数据都应该原样输出,但实际上第一个参数 quote
却被解析了。经过偿试,发现可以用 (quote (quote a b c))
这个方式来输出 (quote a b c)
。
官网上给出一个示例: https://www.gnu.org/software/emacs/manual/html_node/elisp/Quoting.html
'(quote foo)
⇒ 'foo
但是官网没有解释为什么输出是这个。