如何在Scheme中处理未指定数量的参数?

问题描述 投票:23回答:2

例如 ((fn-stringappend string-append) "a" "b" "c") 我知道怎么处理 (f x y z). 但是如果参数数量未知怎么办?有什么办法可以处理这种问题吗?

function scheme variadic-functions variadic
2个回答
28
投票

在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中是这样的)


7
投票

除了Óscar López的答案,你也可以像这样将变量参数做成匿名函数。

(lambda args ...)

同样,在这个函数中 lambda, args 是一个传递的参数列表。

© www.soinside.com 2019 - 2024. All rights reserved.