2012-09-28 26 views
6

Có cách nào để xóa các mục trong danh sách lồng nhau theo loại như vậy (1 [2] 3 (4 [5] 6)) trở thành (1 3 (4 6)) nếu tôi chỉ muốn xóa các vectơ?Làm cách nào để xóa một mục theo loại từ danh sách lồng nhau hoặc vectơ trong Clojure?

Sử dụng postwalk, tôi có thể thay thế tất cả các vectơ bằng 0 nhưng tôi không thể tìm cách xóa chúng.

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

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

Trả lời

4

Viễn từ hoàn hảo nhưng có lẽ đó là một khởi đầu tốt:

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

Điều này có vẻ chính xác những gì tôi đang tìm kiếm. Nó không xảy ra với tôi rằng tôi có thể thực hiện một chức năng chỉ trên các cấu trúc phụ. Cảm ơn. – dansalmo

2

Tôi rất muốn nhìn thấy một giải pháp ngắn gọn hơn bằng clojure.walk, nhưng đây là một trong đó sử dụng một hàm đệ quy và mapcat:

(defn remove-vectors [coll] 
    (mapcat 
    (fn [x] 
     (cond 
     (vector? x) nil 
     (coll? x) (list (remove-vectors x)) 
     :else (list x))) 
    coll)) 

và một trong đó sử dụng filtermap:

01.
(defn remove-vectors [coll] 
    (map #(if (coll? %) (remove-vectors %) %) (remove vector? coll))) 
Các vấn đề liên quan