如何定义可变参数函数

12

我正在寻找类似于JavaScript的arguments数组的东西:

function parent(){
  child.apply(this.arguments);
}

我知道使用点符号来表示可变参数的长度,也知道Scheme语言中的apply函数。

但是这种方式似乎无法工作,因为点符号被视为第一个参数:

(define (parent .) 
          (list .))

(parent 1 3 4 6 7)
Error: bad argument count - received 5 but expected 1: #<procedure (array arg-list)>

这个方法可行但并不理想。我希望能够在不定义参数列表的情况下调用函数:

(define (parent args-list)
     (apply list args-list))


(parent 1 3 4 6 7)
Error: bad argument count - received 5 but expected 1: #<procedure (array args-list)>

(parent `(1 3 4 6 7))
(1 3 4 6 7)
2个回答

17

正确的语法是:

(define (parent . args-list)
    <do something with args-list>)

像这样使用:

(parent 1 2 3 4 5)

在过程内部,所有的参数都将被绑定到一个名为args-list的列表中。在上面的代码片段中,args-list的值为'(1 2 3 4 5)。这是Scheme中可变参数函数工作的一个例子。

为了完整起见,同样的机制也可以用于匿名函数(注意args-list没有被括号包围):

((lambda args-list <do something with args-list>) 1 2 3 4 5)

7
你希望:
您想要:
(define (parent . args) 
   args) ; args is a list

实际上,list 的“默认”实现就是这样。
(define (list . x) x)

应用(define (parent . ) ...)时出现的错误信息似乎是错误的,而且,由于它是无效的语法,代码本应该在第一次编译时就不能通过。这可能意味着您使用的Chicken Scheme版本存在漏洞。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接