Common Lisp:反引号中的unquoting符号

pis*_*hio 2 lisp common-lisp

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

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

;; (DEFUN TEST "arg1" "arg2")
Run Code Online (Sandbox Code Playgroud)

为什么会出现args一个符号列表QUOTE

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

;; (DEFUN TEST (QUOTE ARG1) 'ARG2)
Run Code Online (Sandbox Code Playgroud)

Phi*_*fer 8

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

'('arg1 'arg2)
Run Code Online (Sandbox Code Playgroud)

相当于

(quote ((quote arg1) (quote arg2)))
Run Code Online (Sandbox Code Playgroud)

评估到此列表:

((quote arg1) (quote arg2))
Run Code Online (Sandbox Code Playgroud)

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

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