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

Joh*_*ohn 21 scheme variadic variadic-functions

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

Ósc*_*pez 25

在Scheme中,您可以使用点表示法来声明接收可变数量参数的过程(也称为varargs可变参数函数):

(define (procedure . args)
  ...)
Run Code Online (Sandbox Code Playgroud)

在里面procedure,args将是一个包含零个或多个参数的列表; 这样叫:

(procedure "a" "b" "c")
Run Code Online (Sandbox Code Playgroud)

正如@Arafinwe所指出的,这是匿名过程的等效符号:

(lambda args ...)
Run Code Online (Sandbox Code Playgroud)

像这样称呼它:

((lambda args ...) "a" "b" "c")
Run Code Online (Sandbox Code Playgroud)

请记住,如果您需要将未知大小的列表中的参数传递给可变参数函数,您可以这样写:

(apply procedure '("a" "b" "c"))
(apply (lambda args ...) '("a" "b" "c"))
Run Code Online (Sandbox Code Playgroud)

更新:

关于注释中的代码,这不会像您想要的那样工作:

(define (fp f)
  (lambda (.z)
    (f .z)))
Run Code Online (Sandbox Code Playgroud)

我相信你的意思是:

(define (fp f)
  (lambda z
    (apply f z)))
Run Code Online (Sandbox Code Playgroud)

通过一些语法糖,上述过程可以进一步简化为:

(define ((fp f) . z)
  (apply f z))
Run Code Online (Sandbox Code Playgroud)

但这只是一个简单的写作方式:

(apply f z)
Run Code Online (Sandbox Code Playgroud)

这是你需要的吗?

(apply string-append '("a" "b" "c"))
Run Code Online (Sandbox Code Playgroud)

因为无论如何,这相当于以下内容:

(string-append "a" "b" "c")
Run Code Online (Sandbox Code Playgroud)

string-append 已经收到零个或多个参数(至少在Racket中就是这种情况)


Lil*_*ung 6

除了ÓscarLópez的答案外,您还可以使变量参数成为匿名函数,如下所示:

(lambda args ...)
Run Code Online (Sandbox Code Playgroud)

在内lambda,又args是传递的参数列表。

  • “点”与参数的名称是分开的。 (2认同)