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



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

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

错误:

Arity mismatch

如何在带省略号的球拍中定义函数?

这有两半:

  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

相关内容

  • 没有找到相关文章

最新更新