我正在寻找类似于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)
答案 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版本的错误。