Function &;rest在公共lisp中

Function &;rest在公共lisp中,function,macros,lisp,common-lisp,Function,Macros,Lisp,Common Lisp,我对&rest在commonlisp中的作用感到困惑。 这可以作为一个例子来说明我的意思: (defmacro switch (value &rest pairs) .... ) &rest和pairs的确切含义是什么?函数(或宏)定义中的最后一个参数前面可以是&rest。在这种情况下,当调用函数(或宏)时,所有未绑定到前面参数的参数都被收集到绑定到最后一个参数的列表中。这是一种为函数或宏提供未指定数量参数的方法 例如: CL-USER> (defun

我对
&rest
在commonlisp中的作用感到困惑。 这可以作为一个例子来说明我的意思:

(defmacro switch (value &rest pairs)
             .... 
)

&rest和pairs的确切含义是什么?

函数(或宏)定义中的最后一个参数前面可以是
&rest
。在这种情况下,当调用函数(或宏)时,所有未绑定到前面参数的参数都被收集到绑定到最后一个参数的列表中。这是一种为函数或宏提供未指定数量参数的方法

例如:

CL-USER> (defun f (a &rest b)
           (list a (mapcar #'1+ b)))
F
CL-USER> (f 1 2 3 4 5)
(1 (3 4 5 6))
CL-USER> (f 1)
(1 NIL)
CL-USER> (f 1 2 3)
(1 (3 4))
CL-USER> (defmacro m (f g &rest pairs)
           (let ((operations (mapcar (lambda (pair) (list g (first pair) (second pair))) pairs)))
             `(,f (list ,@operations))))
M
CL-USER> (macroexpand-1 '(m print + (1 2) (3 4) (5 6)))
(PRINT (LIST (+ 1 2) (+ 3 4) (+ 5 6)))
T
CL-USER> (m print + (1 2) (3 4) (5 6))
(3 7 11)

请注意,如果没有剩余参数,则传递给最后一个参数的列表为空。

此文档/教程可能会有所帮助:与其说是“无限”,不如说是“未指定”,参数列表的长度有实现限制。