【发布时间】:2012-09-30 03:33:57
【问题描述】:
例如((fn-stringappend string-append) "a" "b" "c") 我知道如何处理这个(f x y z)。但是如果有未知数量的参数怎么办?有没有办法处理这种问题?
【问题讨论】:
标签: function scheme variadic-functions variadic
例如((fn-stringappend string-append) "a" "b" "c") 我知道如何处理这个(f x y z)。但是如果有未知数量的参数怎么办?有没有办法处理这种问题?
【问题讨论】:
标签: function scheme variadic-functions variadic
在 Scheme 中,您可以使用点符号来声明一个接收可变数量参数的过程(也称为 varargs 或 variadic function):
(define (procedure . args)
...)
在procedure、args 内部将是一个传递零个或多个参数的列表;像这样称呼它:
(procedure "a" "b" "c")
正如@Arafinwe 所指出的,这是匿名过程的等效符号:
(lambda args ...)
这样称呼它:
((lambda args ...) "a" "b" "c")
请记住,如果您需要将未知大小列表中的参数传递给可变参数函数,您可以这样编写:
(apply procedure '("a" "b" "c"))
(apply (lambda args ...) '("a" "b" "c"))
更新:
关于 cmets 中的代码,这不会按您的意愿工作:
(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 中是这样)
【讨论】:
除了 Óscar López 的回答之外,您还可以像这样创建一个可变参数的匿名函数:
(lambda args ...)
同样,lambda、args 内部是传递的参数列表。
【讨论】: