For example ((fn-stringappend string-append) "a" "b" "c")
I know how to handle this (f x y z)
. But what if there's an unknown number of parameters? Is there any way to handle this kind of problem?

- 232,561
- 37
- 312
- 386

- 827
- 5
- 15
- 25
2 Answers
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)

- 232,561
- 37
- 312
- 386
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.

- 2,919
- 1
- 25
- 42
-
(define (fp f) (lambda (.z) (f .z))) f contains unknown number of parameter. what wrong with my code or Do I have to do like z ... – John Sep 30 '12 at 04:35
-
2The "dot" is separate from the name of the argument. – dyoo Oct 01 '12 at 01:59