为什么在此宏定义中需要@符号?

| 在下面的时候宏:
(defmacro when (condition &rest body)
  `(if ,condition (progn ,@body)))
为什么会有at符号?     
已邀请:
通过做一些实验很容易看出差异
> (let ((x \'(1 2 3 4))) `(this is an example ,x of expansion))
(THIS IS AN EXAMPLE (1 2 3 4) OF EXPANSION)

> (let ((x \'(1 2 3 4))) `(this is an example ,@x of expansion))
(THIS IS AN EXAMPLE 1 2 3 4 OF EXPANSION)
如您所见,使用
,@
会将列表的元素直接放在扩展中。取而代之的是将列表放置在扩展中。     
Practical3ѭ也可以被认为是解构列表并将其添加到列表中,如《实践通用Lisp》中所述。
`(a ,@(list 1 2) c) 
等价于:
(append (list \'a) (list 1 2) (list \'c)) 
产生:
(a 1 2 c)
    

要回复问题请先登录注册