如何从Clojure中的嵌套列表或向量中按类型删除项?

时间:2012-09-28 20:26:32

标签: clojure nested-forms

有没有办法按类型删除嵌套列表中的项目(1 [2] 3(4 [5] 6))变为(1 3(4 6))如果我只想删除向量?

使用postwalk,我可以用nil替换所有向量,但我找不到删除它们的方法。

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

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

2 个答案:

答案 0 :(得分:5)

远非完美,但也许这是一个好的开始:

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

答案 1 :(得分: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)))