1

私はこのようなことをしたいと思っています:

(search data 
  list?
  (fn [x] (and (list? x) (= 4 (first x))))
  (fn [x] (and (set? x) (contains x 3))))

そして、ネストされたデータ構造を再帰的に検索しますdata

  1. 最初に最も浅いリスト(たとえば、セットのセットに含まれる場合があります)。
  2. 次に、これらのリスト内で、最初の要素がである最も浅いリストを示します4
  3. 次に、3を含む最も浅いセットのリストにあります。
  4. 最後に、手順3で見つかったアイテムのリストを返します。

車輪の再発明をする前に、これを行う標準的な方法はありますか?

4

1 に答える 1

6

Clojureには、ツリーをトラバースするための標準的な方法があります。clojure.zipを調べ、tree-seqも調べる必要があります。

(loop [loc dz] 
  (if (end? loc) 
    (root loc) 
    (recur (next (if (= '* (node loc)) 
                   (replace loc '/) loc))))) 

(loop [loc dz] 
  (if (end? loc) 
    (root loc) 
    (recur (next (if (= '* (node loc)) 
                   (remove loc) loc))))) 

clojure.zipの最後にあるこれらの2つの例は、データ構造がどのように見えるかを知る必要がないことを明確にしているようです。ループを使用すると、データ構造をトラバースするときに、関心のある値のみを簡単に累積できることもわかります。

于 2009-12-08T19:02:54.327 に答える