2012-02-15 23 views
7

Ben bir referece olarak tanımlanan bir harita vektörünü kullanıyorum.clojure - bir ref vektöründen bir elementi sil

i vektörü tek bir harita silmek istiyor ve ben sırayla i subvec kullanmalıdır bir vektör bir öge silmek için biliyoruz.

Sorunum, bir başvuru vektörü üzerinden subvec uygulanmasının bir yolunu bulamadığım. kullanarak (dosync (commute v assoc 0 (vec (concat (subvec @v 0 1) (subvec @v 2 5))))), bu nedenle vec işlevinden döndürülen seq vektör 0 dizininde yer alacak, ancak işe yaramadı.

Bunu nasıl uygulayacağına dair bir fikri olan var mı?

sayesinde

(sadece alter gibi)
+0

Silmek istediğiniz bir şeyi rastgele erişimli bir şekilde saklamak için bir vektör kullanmak genellikle yanlış bir seçimdir - etkin bir şekilde yapamazlar ve sonuç olarak bunları yapmak için dil özellikleri gariptir. Bunun yerine sadece bir liste/sırala kullanmayı düşünün. – amalloy

cevap

5

commute referans değere tatbik edilecek bir işlev gerekmektedir.

Böylece gibi bir şey isteyecektir:

;; 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] 

Not vektörü bir öge silmek için kodu dışarı ayıran çeşitli nedenlerden dolayı genellikle iyi bir fikir olduğunu:

  • Bu fonksiyonudur potansiyel olarak yeniden kullanılabilir başka bir yerde
  • Bu işlem kodunuzu daha kısa ve daha az tersine çevrilebilir yapar
+0

'(count vc)', üçüncü bir argüman olarak (subvec vc) ' –

+0

iyi nokta güncellendi ve teşekkürler! Cevap ve ipuçları için – mikera

+0

teşekkürler. –