clojure - 从ref向量中删除一个元素

时间:2012-02-15 12:04:07

标签: vector clojure ref

我正在使用一个定义为参考的地图矢量。

我想从向量中删除单个地图,我知道为了从向量中删除元素,我应该使用subvec

我的问题是我找不到在参考向量上实现subvec的方法。 我尝试使用: (dosync (commute v assoc 0 (vec (concat (subvec @v 0 1) (subvec @v 2 5))))),以便从vec函数返回的seq将位于向量的索引0上,但它不起作用。

有没有人知道如何实现这个?

感谢

1 个答案:

答案 0 :(得分:5)

commute(就像alter)需要一个将应用于引用值的函数。

所以你会想要这样的东西:

;; define your ref containing a vector
(def v (ref [1 2 3 4 5 6 7]))

;; define a function to delete from a vector at a specified position
(defn delete-element [vc pos]
  (vec (concat 
         (subvec vc 0 pos) 
         (subvec vc (inc pos)))))

;; delete element at position 1 from the ref v
;; note that communte passes the old value of the reference
;; as the first parameter to delete-element
(dosync 
  (commute v delete-element 1))

@v
=> [1 3 4 5 6 7]

请注意,分离出代码以从向量中删除元素通常是个好主意,原因如下:

  • 此功能可能在其他地方重复使用
  • 它使您的交易代码更短,更自我解释