(conj coll x)
,出于性能原因,会将x
添加到某些集合的末尾以及其他集合的开头。
有没有办法检查集合是自然添加还是添加开始?即。
(conj-at-end? x) ; false for lists and true for vectors.
通过检查某些内容是否为矢量或列表等,编写自己的内容相当容易,但如果添加了新的集合或发生了更改,则会出错。
答案 0 :(得分:0)
conj
是IPersistentCollection
interface的一部分。该接口仅定义了三种方法:
所以,没有像conj-at-end?
那样的东西。
我认为它也不能实现。例如,您如何为内部未排序的集合定义它,例如hash-maps和hash-sets?
(conj #{1 2 3 4 5} 6)
; => #{1 4 6 3 2 5}
答案 1 :(得分:0)
conj
是否会添加到集合的开头或结尾?
这个问题只对顺序集合有意义,你可以尝试一下:
定义
(defn conj-at-end? [coll]
(and (sequential? coll)
(= (conj (empty coll) 1 2) [1 2])))
然后
(conj-at-end? []) ;=> true
(conj-at-end? ()) ;=> false
和
(conj-at-end? #{}) ;=> false
我们还需要相应的
(defn conj-at-beginning? [coll]
(and (sequential? coll)
(= (conj (empty coll) 1 2) [2 1])))
然后
(conj-at-beginning? []) ;=> false
(conj-at-beginning? ()) ;=> true
和
(conj-at-beginning? #{}) ;=> false
请注意,集合既不是conj-at-beginning?
也不是conj-at-end?
。
如果clojure.lang.PersistentArrayMap
由array-map
生成conj
s,那么这个相当轻微的解决方案会被打乱
clojure.lang.Sequential
下保持稳定,但不是,{/ li>
sequential?
界面,
由{{1}}测试,但他们没有。{/ li>