Common Lisp:反引号中的unquoting符号

时间:2015-04-21 12:31:07

标签: lisp common-lisp

以下代码给出了预期的结果:

(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)

1 个答案:

答案 0 :(得分:8)

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

'('arg1 'arg2)

相当于

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

评估此列表:

((quote arg1) (quote arg2))

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

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