形参前的&rest

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))

原文地址:https://www.cnblogs.com/flowjacky/p/2826403.html