2012-09-28 6 views
6

ベクトルだけを削除したい場合は、(1 [2] 3(4 [5] 6))が(1 3(4 6))になるような型で入れ子リスト内のアイテムを削除する方法はありますか?Clojureのネストされたリストまたはベクターからタイプごとにアイテムを削除するにはどうすればよいですか?

ポストウォークを使って、すべてのベクトルをnilに置き換えることができますが、それらを削除する方法が見つかりません。

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

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

答えて

4
完璧にはほど遠い

おそらくそれは良いスタートです。ここ

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

これはまさに私が探していたようです。サブ構造だけで機能を実行することはできませんでした。ありがとう。 – dansalmo

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を使用しています1:

(defn remove-vectors [coll] 
    (map #(if (coll? %) (remove-vectors %) %) (remove vector? coll))) 
関連する問題