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