Lisp/Scheme/Racket: 如何用省略号定义一个函数
Lisp/Scheme/Racket: How to define a function with ellipsis
我想在 Racket 中定义一个参数数量未定义的函数,所以我使用了省略号,但它不起作用:
(define (f x ...) (printf x ...))
(f "~a ~a" "foo" "bar")
错误:
Arity mismatch
如何使用省略号在 Racket 中定义一个函数?
这个有两半:
- 接受任意数量的输入
- 将任意数量的参数传递给另一个函数
要接受任意数量的输入,而不是 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
我想在 Racket 中定义一个参数数量未定义的函数,所以我使用了省略号,但它不起作用:
(define (f x ...) (printf x ...))
(f "~a ~a" "foo" "bar")
错误:
Arity mismatch
如何使用省略号在 Racket 中定义一个函数?
这个有两半:
- 接受任意数量的输入
- 将任意数量的参数传递给另一个函数
要接受任意数量的输入,而不是 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