为什么在这个宏定义中需要@符号?
问题描述:
在下面当宏:为什么在这个宏定义中需要@符号?
(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)
看出区别正如你可以看到使用@
将放置列表的元素里面直接在扩张。如果没有,你会得到扩展名列表。
答
也可以认为@
解构列表并将其附加到列表中,如Practical Common Lisp中所述。
`(a ,@(list 1 2) c)
是等价的:
(append (list 'a) (list 1 2) (list 'c))
其产生:
(a 1 2 c)