26

例如((fn-stringappend string-append) "a" "b" "c") 我知道如何处理这个(f x y z)。但是如果有未知数量的参数怎么办?有没有办法处理这种问题?

4

2 回答 2

34

在 Scheme 中,您可以使用点符号来声明一个接收可变数量参数的过程(也称为varargsvariadic function):

(define (procedure . args)
  ...)

内部procedureargs将是一个传递零个或多个参数的列表;像这样称呼它:

(procedure "a" "b" "c")

正如@Arafinwe 所指出的,这是匿名过程的等效符号:

(lambda args ...)

像这样称呼它:

((lambda args ...) "a" "b" "c")

请记住,如果您需要将未知大小列表中的参数传递给可变参数函数,您可以这样编写:

(apply procedure '("a" "b" "c"))
(apply (lambda args ...) '("a" "b" "c"))

更新:

关于评论中的代码,这不会按您的意愿工作:

(define (fp f)
  (lambda (.z)
    (f .z)))

我相信你的意思是:

(define (fp f)
  (lambda z
    (apply f z)))

加上一点语法糖,上述过程可以进一步简化为:

(define ((fp f) . z)
  (apply f z))

但这对于简单的写作来说还有很长的路要走:

(apply f z)

这是你需要的吗?

(apply string-append '("a" "b" "c"))

因为无论如何这相当于以下内容:

(string-append "a" "b" "c")

string-append 已经收到零个或多个参数(至少在 Racket 中是这样)

于 2012-09-30T03:40:56.067 回答
7

除了 Óscar López 的回答,您还可以像这样创建一个可变参数的匿名函数:

(lambda args ...)

同样,在 , 内部lambdaargs传递的参数列表。

于 2012-09-30T04:04:30.353 回答