7

如果我只想删除向量,有没有办法按类型删除嵌套列表中的项目,使得 (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))
4

2 回答 2

5

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

 (clojure.walk/prewalk #(if (list? %) (remove vector? %) %) '(1 [2] 3 (4 [5] 6)))
于 2012-09-28T21:21:11.353 回答
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))

还有一个使用filterand map

(defn remove-vectors [coll]
  (map #(if (coll? %) (remove-vectors %) %) (remove vector? coll)))
于 2012-09-28T21:23:10.913 回答