Lisp / Scheme / Racket:如何用省略号定义函数

时间:2020-02-09 01:59:33

标签: function scheme racket variadic-functions arity

我想在Racket中使用未定义数量的参数定义一个函数,因此我使用省略号,但它不起作用:

(define (f x ...) (printf x ...))
(f "~a ~a" "foo" "bar")

错误:

Arity mismatch

如何在带有省略号的球拍中定义功能?

1 个答案:

答案 0 :(得分:5)

这有两半:

  1. 接受任意数量的输入
  2. 将任意数量的参数传递给另一个函数

要接受任意数量的输入,而不是...之后的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
相关问题