Vector clojure-从引用向量中删除元素

Vector clojure-从引用向量中删除元素,vector,clojure,ref,Vector,Clojure,Ref,我使用的是一个定义为参考的地图向量 我想从向量中删除一个映射,我知道为了从向量中删除一个元素,我应该使用subvec 我的问题是,我找不到一种在参考向量上实现子向量的方法。 我试着用以下方法来做: (dosync(concurrent v assoc 0(vec)(concat(subvec@v 0 1)(subvec@v 2 5щщ)),因此从vec函数返回的seq将位于向量的索引0上,但它不起作用 有人知道如何实现这一点吗 谢谢(就像)需要一个将应用于引用值的函数 因此,您将需要以下内容:

我使用的是一个定义为参考的地图向量

我想从向量中删除一个映射,我知道为了从向量中删除一个元素,我应该使用
subvec

我的问题是,我找不到一种在参考向量上实现
子向量的方法。
我试着用以下方法来做:
(dosync(concurrent v assoc 0(vec)(concat(subvec@v 0 1)(subvec@v 2 5щщ))
,因此从
vec
函数返回的seq将位于向量的索引0上,但它不起作用

有人知道如何实现这一点吗

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

因此,您将需要以下内容:

;; 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]
请注意,分离代码以从向量中删除元素通常是一个好主意,原因如下:

  • 此函数可能在其他地方重复使用
  • 它使您的事务代码更短,更具自我描述能力

(count vc)
是多余的,因为
(subvec vc)
的第三个参数使用向量来存储您想要以随机访问方式删除的内容通常是错误的选择-它们不能有效地执行此操作,因此使用它们执行此操作的语言功能非常笨拙。考虑只使用列表/SEQ来代替。