例如 ((fn-stringappend string-append) "a" "b" "c")
我知道怎么处理 (f x y z)
. 但是如果参数数量未知怎么办?有什么办法可以处理这种问题吗?
在Scheme中,你可以使用点符号来声明一个接收参数数量可变的过程(也称为 变数 或 变函数):
(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"))
UPDATE:
关于注释中的代码,这不会像你想的那样工作。
(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
"已经 接收0个或更多的参数(至少在Racket中是这样的)
除了Óscar López的答案,你也可以像这样将变量参数做成匿名函数。
(lambda args ...)
同样,在这个函数中 lambda
, args
是一个传递的参数列表。