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

走远了吗. 提交于 2019-11-27 12:17:21

问题


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?


回答1:


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)




回答2:


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.



来源:https://stackoverflow.com/questions/12658406/how-do-i-handle-an-unspecified-number-of-parameters-in-scheme

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