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

时间:2012-09-30 03:33:57

标签: scheme variadic-functions variadic

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

2 个答案:

答案 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是传递的参数列表。