4

我有一系列列表:

(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,或者是否存在执行此操作的库函数?

4

2 回答 2

3

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

但是,如果这个集合大部分都向左增长而很少向右增长,那么 concat 可能是您的最佳选择:

(连接'((1 2))[ '(3 4)]

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

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

于 2013-04-28T16:14:06.930 回答
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))
于 2013-04-28T15:57:09.770 回答