在Clojure中,如何收集或结合集合的元素而不是集合本身?

时间:2011-10-04 18:04:10

标签: clojure lisp

缺点目前表现如下:

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

我想实现:

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

我找不到这方面的资源但这看起来很简单我觉得应该有一个内置函数。

或者我只是不知道用于描述这种情况的写字。无论哪种方式,请告诉我。谢谢!

编辑: 请不要回答“flatten”:P ie

(flatten (cons '(1 2) '(3)))

3 个答案:

答案 0 :(得分:10)

您必须使用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)

答案 1 :(得分:5)

我相信你正在寻找concat(想想“连接列表”):

  

[Concat]返回一个懒惰的seq,表示所提供的colls中元素的串联。

在这种情况下,用法是:

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

请注意,与(许多)其他LISP方言不同,Clojure的concat会产生懒惰序列。请参阅How to covert a lazy sequence to a non-lazy in Clojure?了解如何“强制”序列(这可能会或可能没有用/需要,具体取决于更大的背景,但重要的是要记住)。

快乐的编码。

答案 2 :(得分:4)

另一种选择是“进入”。

into总是返回第一个参数的类型,不像concat总是返回一个列表。

=> (into [2 4] '(1 2 3))
[2 4 1 2 3]

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