在学习 Eamcs Lisp 的时候时发现了一个奇怪的问题,虽然知道解决方案,但却不知道产生这个问题的原因。因此记录下。

在 Emacs 中构造一个列表有三种方式,分别是 list , quotebackquote

对于 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

但是官网没有解释为什么输出是这个。