我需要创建一个函数,它接受任意数量的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
我该如何实施?
答案 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"