如果我只想删除向量,有没有办法按类型删除嵌套列表中的项目,使得 (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))
如果我只想删除向量,有没有办法按类型删除嵌套列表中的项目,使得 (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))
远非完美,但也许这是一个好的开始:
(clojure.walk/prewalk #(if (list? %) (remove vector? %) %) '(1 [2] 3 (4 [5] 6)))
我很想看到一个更简洁的解决方案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
and map
:
(defn remove-vectors [coll]
(map #(if (coll? %) (remove-vectors %) %) (remove vector? coll)))