ベクトルだけを削除したい場合、(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
ものmap
:
(defn remove-vectors [coll]
(map #(if (coll? %) (remove-vectors %) %) (remove vector? coll)))