2012-02-15 18 views
7

से एक तत्व हटाएं मैं मानचित्र के वेक्टर का उपयोग कर रहा हूं जो एक जनमत के रूप में परिभाषित किया गया है।क्लोजर - एक रेफ वेक्टर

मैं वेक्टर से एक नक्शा हटाना चाहता हूं और मुझे पता है कि वेक्टर से तत्व को हटाने के लिए मुझे subvec का उपयोग करना चाहिए।

मेरी समस्या यह है कि मुझे संदर्भ वेक्टर पर subvec को लागू करने का कोई तरीका नहीं मिला। मैंने इसे उपयोग करने का प्रयास किया: (dosync (commute v assoc 0 (vec (concat (subvec @v 0 1) (subvec @v 2 5))))), ताकि vec फ़ंक्शन से वापस लौटाया गया हो, वेक्टर के इंडेक्स 0 पर स्थित होगा लेकिन यह काम नहीं करता है।

क्या किसी को यह पता है कि इसे कैसे कार्यान्वित किया जाए?

धन्यवाद

+0

किसी स्टोर को स्टोर करने के लिए वेक्टर का उपयोग करके आप यादृच्छिक-पहुंच फैशन में हटाना चाहते हैं, आमतौर पर गलत विकल्प होता है - वे इसे कुशलता से नहीं कर सकते हैं और नतीजतन भाषा उनके साथ ऐसा करने के लिए सुविधाएं अजीब हैं। इसके बजाय केवल एक सूची/seq का उपयोग करने पर विचार करें। – amalloy

उत्तर

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] 

ध्यान दें कि कोड को अलग वेक्टर से एक तत्व नष्ट करने के लिए कई कारणों से एक आम तौर पर अच्छा विचार है:

  • इस समारोह है संभावित रूप से पुनः उपयोग करने योग्य अन्यत्र
  • यह आपके लेनदेन कोड को छोटा और अधिक आत्म-desciptive
+0

'(गणना vc)' तीसरे तर्क के रूप में अनावश्यक है (subvec vc) ' –

+0

अच्छी जगह, अद्यतन और धन्यवाद! – mikera

+0

उत्तर और सुझावों के लिए धन्यवाद। –

संबंधित मुद्दे