如何定义一个可变参数函数(How to define a variadic function)

2019-08-01 13:47发布

我在寻找类似的JavaScript的一些arguments数组:

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

我知道点符号的可变参数的长度,并且还计划的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)

Answer 1:

正确的语法是:

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

使用这样的:

(parent 1 2 3 4 5)

里面的程序,所有的参数将被绑定到列表名为args-list 。 在上面的代码中, args-list将具有'(1 2 3 4 5)作为其值。 这是如何可变参数功能计划工作的例子。

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

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


Answer 2:

你要:

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

这是逸岸“默认”的实施list

(define (list . x) x)

该错误消息在申请时(define (parent . ) ...)似乎是错误的,也行,代码不应该编译摆在首位,因为它是无效的语法。 可能意味着与鸡肉方案的版本,您使用的错误。



文章来源: How to define a variadic function