如何使用未知数量的变量定义函数?
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)
您可以看到可选的第二个参数和第二个参数作为列表可用。要访问它们,您可以使用标准列表访问器,例如 car
、cdr
、nth
等
lambda
也是如此。
您可以在 Dr Racket: 3.8 Procedure Expressions: lambda and lambda-case 上阅读更多相关信息(查找 rest-id
)。
我是第一次学习 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)
您可以看到可选的第二个参数和第二个参数作为列表可用。要访问它们,您可以使用标准列表访问器,例如 car
、cdr
、nth
等
lambda
也是如此。
您可以在 Dr Racket: 3.8 Procedure Expressions: lambda and lambda-case 上阅读更多相关信息(查找 rest-id
)。