Common Lisp:反引号中的反引号

Common Lisp: unquoting symbol in backquote

下面的一段代码给出了预期的结果:

(let ((name 'test)
      (args '("arg1" "arg2")))
     `(defun ,name ,@args))

;; (DEFUN TEST "arg1" "arg2")

如果 args 是符号列表,为什么会出现 QUOTE

(let ((name 'test)
      (args '('arg1 'arg2)))
     `(defun ,name ,@args))

;; (DEFUN TEST (QUOTE ARG1) 'ARG2)

reader 将 'symbol 扩展为 (quote symbol)。所以在你的情况下

'('arg1 'arg2)

相当于

(quote ((quote arg1) (quote arg2)))

计算结果为这个列表:

((quote arg1) (quote arg2))

从反引号开始评估您的表单会导致将列表元素((quote arg1)(quote arg2))拼接在结果列表 (defun ...) 中与之前的字符串相同的位置。

我不知道为什么您的实现打印第一个展开的拼接元素而不是第二个。但是,如上所述,两种形式在阅读时是等价的。