📜  LISP 中的剩余参数

📅  最后修改于: 2022-05-13 01:55:26.468000             🧑  作者: Mango

LISP 中的剩余参数

LISP函数的参数列表的基本目的是声明将接收在函数中传递的参数的变量。通常参数列表包含变量名称的基本列表,这些参数称为“必需参数”。如果一个函数被调用,对于每个必需的参数,它应该被提供一个单独的参数,如果它被更多或更少的参数调用,LISP 将显示一个错误。

参数列表中的参数类型

  • 必需参数
  • 可选参数
  • 休息参数
  • 关键字参数

休息参数

有时一个函数需要接受可变数量的参数,例如,在 LISP 中采用+函数,它接受可变数量的参数并且不仅限于 2 个参数,对+函数的可能调用包括:

(+)
(+ 9)
(+ 5 2)
(+ 3 7 1)

如您所见, +函数的参数列表可能类似于:

(defun + (&rest numbers) ...) 

但是你可能怀疑我们是否也可以编写这样的函数,通过具有多个可选参数来接收可变数量的参数,但是如此多的处理参数不被认为是正确的 LISP 礼仪。

定义休息参数的语法:

要在函数中定义任何剩余参数,请在参数名称前添加符号: &rest ,当您调用函数时,必需参数和可选参数之后的所有参数都组合到一个列表中,它们成为&rest参数的值。

例子:

让我们创建一个函数,其中r1r2将是必需参数,除此之外的任何参数都是其余参数。

(defun rest_example (r1 r2 &rest rest)...)

现在我们知道在必需参数和可选参数被分组到一个剩余参数列表之后的任何参数,所以让我们打印这些剩余参数以及我们的必需参数。

(format t "Required parameters: ~d & ~d.~%" r1 r2)
(format t "Rest parameters: ~d~%" rest)

现在让我们通过传递只需要的参数来调用这个函数,第二次通过传递其余参数来调用这个函数

(rest_example 50 80)
(rest_example 40 60 75 67 10 30)

代码 :

Lisp
(defun rest_example (r1 r2 &rest rest)
  (format t "Required parameters: ~d & ~d.~%" r1 r2)
  (format t "Rest parameters: ~d~%" rest))
  
(rest_example 50 80)
(terpri)
(rest_example 40 60 75 67 10 30)


输出 :

Required parameters: 50 & 80.
Rest parameters: NIL

Required parameters: 40 & 60.
Rest parameters: (75 67 10 30)

正如您在我们第一次调用时看到的那样,我们没有传递任何剩余参数,因此剩余参数的值是 NIL,但是当我们使用剩余参数调用函数时,除了所需参数之外,我们的所有参数都被分组到一个剩余列表中参数。