2012-09-28 45 views
6

如果我想刪除矢量,是否有辦法按類型刪除嵌套列表中的項目,使得(1 [2] 3(4 [5] 6))變爲(1 3(4 6))?如何從Clojure中的嵌套列表或向量中刪除項目?

使用postwalk,我可以用零來代替所有的載體,但是我找不到一種方法去除它們。

(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)) 

而且其中一個使用filtermap

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