将列表附加到列表序列

时间:2013-04-28 15:41:14

标签: clojure

我有一系列清单:

(def s '((1 2) (3 4) (5 6)))

我想在此序列的尾部添加另一个列表,即

(concat-list s '(7 8))
=> '((1 2) (3 4) (5 6) (7 8))

(显然)不起作用的各种方法:

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

(conj '(3 4) '((1 2)))
=> (((1 2)) 3 4)

(concat '((1 2)) '(3 4))
=> ((1 2) 3 4)

;; close, but wrong order...
(conj '((1 2)) '(3 4))
=> ((3 4) (1 2))

;; Note: vectors work - do I really have to convert entire 
;; structure from lists to vectors and back again?
(conj [[1 2]] [3 4])
=> [[1 2] [3 4]]

concat-list有哪些可能的实现,或者是否存在执行此操作的库函数?

2 个答案:

答案 0 :(得分:3)

如果你发现这个系列通常会向右增长,那么你应该把它作为一个载体开始并保持这种方式。这将是最有效和方便的。

但是,如果这个集合大多数向左增长而且很少向右增长,那么concat可能是你最好的选择:

(concat '((1 2)) ['(3 4)])

请注意,concat返回一个惰性序列,而不是持久列表。

如果集合很大并且两端都经常增长,那么您可能需要更高级的集合类型,如手指树或flexvec。

答案 1 :(得分:2)

可能有更好的解决方案,但这是一种方式:

user=> s
((1 2) (3 4) (5 6))
user=> s2
(7 8)
user=> (concat s (cons s2 '()))
((1 2) (3 4) (5 6) (7 8))