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

そして、を使用するfilterものmap

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