How do I handle an unspecified number of parameters in Scheme?

六眼飞鱼酱① 提交于 2019-11-28 20:27:31

In Scheme you can use the dot notation for declaring a procedure that receives a variable number of arguments (also known as varargs or variadic function):

(define (procedure . args)
  ...)

Inside procedure, args will be a list with the zero or more arguments passed; call it like this:

(procedure "a" "b" "c")

As pointed out by @Arafinwe, here's the equivalent notation for an anonymous procedure:

(lambda args ...)

Call it like this:

((lambda args ...) "a" "b" "c")

Remember that if you need to pass the parameters in a list of unknown size to a variadic function you can write it like this:

(apply procedure '("a" "b" "c"))
(apply (lambda args ...) '("a" "b" "c"))

UPDATE:

Regarding the code in the comments, this won't work as you intend:

(define (fp f)
  (lambda (.z)
    (f .z)))

I believe you meant this:

(define (fp f)
  (lambda z
    (apply f z)))

With a bit of syntactic sugar the above procedure can be further simplified to this:

(define ((fp f) . z)
  (apply f z))

But that's just a long way for simply writing:

(apply f z)

Is this what you need?

(apply string-append '("a" "b" "c"))

Because anyway that's equivalent to the following:

(string-append "a" "b" "c")

string-append already receives zero or more arguments (at least, that's the case in Racket)

In addition to Óscar López's answer, you can also make an anonymous function of variable arguments like so:

(lambda args ...)

Where again, inside the lambda, args is a list of the arguments passed.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!