2012-09-28 2 views

risposta

4

ben lungi dall'essere perfetto, ma forse è un buon inizio:

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

Questo sembra esattamente quello che stavo cercando. Non mi è venuto in mente che potevo svolgere una funzione solo sulle sottostrutture. Grazie. – dansalmo

2

mi piacerebbe vedere una soluzione più concisa utilizzando clojure.walk, ma qui è uno che utilizza una funzione ricorsiva e mapcat:

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

e uno che utilizza filter e map:

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