获得天然的clojure conj命令

时间:2015-04-04 19:14:35

标签: collections clojure

(conj coll x),出于性能原因,会将x添加到某些集合的末尾以及其他集合的开头。

有没有办法检查集合是自然添加还是添加开始?即。

(conj-at-end? x) ; false for lists and true for vectors.

通过检查某些内容是否为矢量或列表等,编写自己的内容相当容易,但如果添加了新的集合或发生了更改,则会出错。

2 个答案:

答案 0 :(得分:0)

conjIPersistentCollection interface的一部分。该接口仅定义了三种方法:

  • conj - 添加新元素;
  • empty - 返回相同类型的空集合;
  • equiv - 执行相等检查。

所以,没有像conj-at-end?那样的东西。

我认为它也不能实现。例如,您如何为内部未排序的集合定义它,例如hash-mapshash-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.PersistentArrayMaparray-map生成conj s,那么这个相当轻微的解决方案会被打乱

  • clojure.lang.Sequential下保持稳定,但不是,{/ li>
  • 选择遵守空sequential?界面, 由{{1}}测试,但他们没有。{/ li>