如何定义可变参数函数

时间:2012-10-17 19:42:50

标签: function scheme arguments variadic-functions chicken-scheme

我正在寻找类似于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)>

这有效但不理想。我想在没有额外语法的情况下调用函数来定义args列表:

(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 个答案:

答案 0 :(得分:13)

正确的语法是:

(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)

答案 1 :(得分:6)

你想:

(define (parent . args) 
   args) ; args is a list

这实际上是list的'默认'实现。

(define (list . x) x)

应用(define (parent . ) ...)时的错误消息似乎是错误的,同样,代码不应该首先编译,因为它是无效的语法。可能暗示您正在使用的Chicken Scheme版本的错误。