【问题标题】:Lisp/Scheme/Racket: How to define a function with ellipsisLisp/Scheme/Racket:如何用省略号定义函数
【发布时间】:2020-05-24 17:42:06
【问题描述】:

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

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

错误:

Arity mismatch

如何在 Racket 中用省略号定义函数?

【问题讨论】:

  • 提示:这样的函数称为“可变参数函数”。

标签: function scheme racket variadic-functions arity


【解决方案1】:

这有两半:

  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

【讨论】:

    猜你喜欢
    • 2020-05-23
    • 2019-09-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-22
    • 2015-12-03
    • 1970-01-01
    • 1970-01-01
    • 2011-07-10
    相关资源
    最近更新 更多