例如((fn-stringappend string-append) "a" "b" "c")
我知道如何处理这个(f x y z)
。但是,如果参数数量未知,该怎么办?有没有办法处理这类问题?
答案 0 :(得分:25)
在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"))
<强>更新强>
关于评论中的代码,这不会按预期工作:
(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中就是这种情况)
答案 1 :(得分:6)
除了ÓscarLópez的回答,你还可以像这样建立一个变量参数的匿名函数:
(lambda args ...)
同样,在lambda
内,args
是传递的参数列表。