具有未定义数量的参数的Lambda函数

时间:2014-02-12 14:14:32

标签: racket lambda

我需要创建一个函数,它接受任意数量的argumnets并返回这些元素的逗号分隔字符串。

E.g。

(comma-separated-list 1 2 3)
;=> "1 , 2 , 3"

这是我到目前为止所尝试的:

(define (comma-separated-list x . xs)
  (begin
    (display x)
    (when (not (null? xs))
      (begin
        (display " , ")
        (comma-separated-list xs)))))

但这不正常。

举个例子:

(comma-separated-list 1 2 3)

返回字符串:

1 , (2 3)

虽然我希望它返回:

1, 2, 3

我该如何实施?

2 个答案:

答案 0 :(得分:3)

您的代码:

(define (comma-separated-list x . xs) ; (a) can accept any number of arguments
  (begin
    (display x)                       ; (b) print the first argument 
    (when (not (null? xs))
      (begin
        (display " , ")
        (comma-separated-list xs))))) ; (c) a call with just one argument

第一次通话(comma-separated-list 1 2 3)后,您在第(c)行的递归通话相当于

(comma-separated-list '(2 3))

只有一个参数,而不是两个参数。您需要apply comma-separated-list代替其余参数:

(apply comma-separated-list xs)

其他注释

顺便说一下,你所说的你想要的,你在所需输出中显示的内容,以及你的代码将产生什么之间的区别。你最初的例子是

(comma-separated-list 1 2 3)
;=> "1 , 2 , 3"

在逗号之前有空格,这就是你将得到的

(display " , ")

然后在编辑中,你说你想要

1, 2, 3

很容易得到其中一个(只是调整空格),但要注意区别!

答案 1 :(得分:3)

您可以简单地使用string-join

(define (comma-separated-list . lst)
  (string-join 
   (map (lambda (e) (format "~a" e)) lst) 
   ", "))

然后

(comma-separated-list 1 2 3)
=> "1, 2, 3"