以下代码给出了预期的结果:
(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)
读者扩展'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 ...)
中与之前字符串相同的位置.
我不知道为什么你的实现打印扩展的第一个拼接元素而不是第二个.但是,如上所述,两种形式在阅读时都是等同的.