a.如果在一般形参前
CL-USER> (defun hey (x &rest args)
(member x args))
HEY
CL-USER> (hey '1 '(2 1 3))
NIL
CL-USER> (hey '1 '2 '1 '3)
(1 3)
CL-USER> (member '1 '(2 1 3))
(1 3)
CL-USER> (defun world (&rest fn)
fn)
WORLD
CL-USER> (world 'a 'b)
(A B)
CL-USER> (world #'+ #'-)
(#<Compiled-function + #x409FFC6> #<Compiled-function - #x40A0126>)
CL-USER>
说明:&rest的作用就是把参数x后面出现的所有参数包装成一个列表在函数体中使用。
b.如果在关键字参数前,那么不会有打包成列表这一步
CL-USER> (defun our-adjoin (obj lst &rest args)
(if (apply #'member obj lst args)
lst
(cons obj lst)))
OUR-ADJOIN
CL-USER> (member 'a '((a) (b)))
NIL
CL-USER> (member '(a) '((a) (b)) :test #'equal)
((A) (B))
CL-USER> (our-adjoin '(a) '((a) (b)) :test #'equal)
((A) (B))
CL-USER> (our-adjoin '(a) '((a) (b)))
((A) (A) (B))