如何使用未知数量的变量定义函数?

How can I define a function using unkown number of variables?

我是第一次学习 Lisp,我正在研究一个附加两个列表的简单函数。当我测试预定义 append 的功能时,我注意到我可以给它两个以上的列表,我想知道自己该怎么做?所以我想知道如何在 Lisp 中创建一个接受未知数量变量的函数?

使用 &rest lambda list 关键词:

(defun test-rest (a &rest b)
  (format t "1st argument: ~S; 2nd argument: ~S; other arguments: ~S~%"
          a (first b) (rest b)))

现在(test-rest 1 2 3 4)打印

1st argument: 1; 2nd argument: 2; other arguments: (3 4)

如果您对 Scheme 特别感兴趣,可以使用点号 参数列表:

(define (test-rest a . b) 
  (display (list (list "first" a) 
                 (list "others" b))))

现在(test-rest 1 2 3 4)将打印

((first 1) (others (2 3 4)))

您可以使用虚线列表为可选参数定义函数。所有可选参数都将作为列表传递给您的函数。

例如,此函数采用一个强制参数 a0 和任意数量的可选参数作为 a-rest 列表传递:

(define (take-many a0 . a-rest)
  a-rest)

现在,当你调用它时:

(take-many 1 20 333)

=> (20 333)

您可以看到可选的第二个参数和第二个参数作为列表可用。要访问它们,您可以使用标准列表访问器,例如 carcdrnth

lambda也是如此。

您可以在 Dr Racket: 3.8 Procedure Expressions: lambda and lambda-case 上阅读更多相关信息(查找 rest-id)。