我正在使用一个定义为参考的地图矢量。
我想从向量中删除单个地图,我知道为了从向量中删除元素,我应该使用subvec
。
我的问题是我找不到在参考向量上实现subvec
的方法。
我尝试使用:
(dosync (commute v assoc 0 (vec (concat (subvec @v 0 1) (subvec @v 2 5)))))
,以便从vec
函数返回的seq将位于向量的索引0上,但它不起作用。
有没有人知道如何实现这个?
感谢
答案 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]
请注意,分离出代码以从向量中删除元素通常是个好主意,原因如下: