在Clojure中,如何将集合的元素cons或conj在一起,而不是整个集合?

8

目前cons的行为如下:

(cons '(1 2) '(3))
;=> ((1 2) 3)

我希望实现以下目标:

(magic-cons '(1 2) '(3))
;=> (1 2 3)

我还没有找到相关资源,但这似乎很简单,我觉得应该有一个内置函数。
或者我不知道如何描述这种情况。 无论哪种方式,请告诉我。谢谢!
编辑:请不要用“flatten”回答:P
(flatten (cons '(1 2) '(3)))

3
为了让你更好地理解 cons,它代表“构建”。它将新元素逐个添加到列表的开头来构建列表。你正在寻找的那种函数应该将一个列表中的所有元素附加到另一个列表或者只是连接两个列表。因此,在 Common Lisp 中它被称为 append,而在 Clojure 中,正如其他人已经在这里提到的,它被称为 concat - ffriend
3个回答

12

你需要使用concat函数:

clojure.core/concat
([] [x] [x y] [x y & zs])
  Returns a lazy seq representing the concatenation of the elements in the supplied colls.

使用示例:

user> (concat '(1 2) '(3))
(1 2 3)

5

我相信您正在寻找concat函数(意为“连接列表”):

[Concat] 返回一个惰性序列,表示所提供的colls中元素的连接。

在这种情况下,用法如下:

(concat '(1 2) '(3))    

请注意,与(许多)其他LISP方言不同,Clojure的concat生成一个惰性序列。请参见如何在Clojure中将惰性序列转换为非惰性序列?以了解如何“强制”序列(这可能有用/需要,具体取决于更大的上下文,但请牢记这一点)。
愉快的编码。

5
一个替代方案是 "into"。
与concat不同,into始终返回第一个参数的类型。
=> (into [2 4] '(1 2 3))
[2 4 1 2 3]

(into '(2 4) '(1 2 3))
(3 2 1 2 4)

警告:into 可能会改变项目的顺序,就像上面第二个调用一样。 - Tim Smith

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接