我想在Racket中使用未定义数量的参数定义一个函数,因此我使用省略号,但它不起作用:
(define (f x ...) (printf x ...))
(f "~a ~a" "foo" "bar")
错误:
Arity mismatch
如何在带有省略号的球拍中定义功能?
答案 0 :(得分:5)
这有两半:
要接受任意数量的输入,而不是...
之后的x
,请在.
之前放置一个x
。这将x
声明为“ rest”参数,并将这些参数收集到x
的列表中。
示例:
> (define (f . x) x)
> (f "~a ~a" "foo" "bar")
(list "~a ~a" "foo" "bar")
要传递任意数量的参数,可以使用apply
函数,该函数接受列表作为最后一个参数。
示例:
> (apply printf (list "~a ~a" "foo" "bar"))
foo bar
将它们放在一起:
> (define (f . x) (apply printf x))
> (f "~a ~a" "foo" "bar")
foo bar