2012-09-28 15 views
6

क्या नेस्टेड सूची में वस्तुओं को हटाने के लिए कोई तरीका है जैसे कि (1 [2] 3 (4 [5] 6)) (1 3 (4 6)) बन जाता है अगर मैं केवल वैक्टर को हटाना चाहता हूं?क्लोजर में नेस्टेड सूची या वेक्टर से टाइप करके मैं आइटम को कैसे हटा सकता हूं?

पोस्टवॉक का उपयोग करके, मैं सभी वैक्टरों को शून्य के साथ बदल सकता हूं, लेकिन मुझे उन्हें हटाने का कोई तरीका नहीं मिल रहा है।

(clojure.walk/postwalk 
    #(if (vector? %) nil %) '(1 [2] 3 (4 [5] 6))) 

=>(1 nil 3 (4 nil 6)) 

उत्तर

4
सही से

सुदूर लेकिन शायद यह एक अच्छी शुरुआत है:

(clojure.walk/prewalk #(if (list? %) (remove vector? %) %) '(1 [2] 3 (4 [5] 6))) 
+0

यह मैं वास्तव में क्या देख रहा था लगता है। यह मेरे लिए नहीं हुआ कि मैं केवल उप-संरचनाओं पर एक समारोह कर सकता था। धन्यवाद। – dansalmo

2

मैं अधिक संक्षिप्त समाधान clojure.walk का उपयोग कर देखने के लिए अच्छा लगेगा, लेकिन यहाँ एक एक पुनरावर्ती समारोह और mapcat का उपयोग करता है जो है:

(defn remove-vectors [coll] 
    (mapcat 
    (fn [x] 
     (cond 
     (vector? x) nil 
     (coll? x) (list (remove-vectors x)) 
     :else (list x))) 
    coll)) 

और एक जो का उपयोग करता है filter और map:

(defn remove-vectors [coll] 
    (map #(if (coll? %) (remove-vectors %) %) (remove vector? coll)))