以下代码给出了预期的结果:
(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)
答案 0 :(得分:8)
读者将'symbol
扩展为(quote symbol)
。所以在你的情况下
'('arg1 'arg2)
相当于
(quote ((quote arg1) (quote arg2)))
评估此列表:
((quote arg1) (quote arg2))
从反引号开始评估表单会导致列表元素((quote arg1)
和(quote arg2)
)在结果列表(defun ...)
中的相同位置拼接为前面的字符串。
我不知道为什么你的实现会打印扩展的第一个拼接元素,而不是第二个。但是,如上所述,两种形式在阅读时都是等效的。