2011-12-18 16 views
2

私はレコードに似た構造にしたいClojureの値のセットを持っています。私はそれらのレコードのセットを処理する最良の方法を理解しようとしています。レコードで作業するClojure

だから私は、例えば、レコードがあります継続的にコレクションを更新しながら、最高のデータ構造は、私は再帰的にステップスルーすることができ、これらのレコードのコレクションを保持するためにいただきまし

(defrecord Link [page url]) 

を?

これまで、私はシーケンスを使って単一の値でこれを行いました、そして、私はそれらを再帰的に処理するので、最後に新しいリンクを連結します。しかし今、私は各リンクについてより多くの情報を保持したいと思います。

編集クラリティ

のために私は、以前のマップを使用していた、しかし私は、私のような

私を混乱さ
#{:rootlink "http://www.google.co.uk" :links nestedmapoflinks} 

でネストされたマップを使用しようとすることで自分自身を混乱させてきたと思います私はそれを呪うことを試みます。

以下は私が使っているコードですが、現在はリンクのシーケンスでは動作しますが、リンクに関するその他の情報はありません。

(defn get-links 
[url] 
(map :href (map :attrs (html/select (fetch-url url) [:a]))))) 

(defn process-links 
[links] 
(if (not (empty? links)) 
(do 
    (if (not (is-working (first links))) 
(do 
    (println (str (first links) " is not working")) 
    (recur (rest links))) 
(do 
    (println (str (first links) " is working")) 
    (recur (concat (rest links) (get-links (first links))))))))) 

私が代わりにネストされたマップで作業しようとしているの

{:rootlink "http://www.google.co.uk" :link "http://someurlontherootlinkpage.com"} 

でマップに各項目を追加するために持っていると思います。

しかし、私はマップ作成の最初の方法を使って2つのマップを結合するのに苦労していたので、私はレコードを述べました。私はまだマップを再帰的に使用するための最良の構造について少し混乱しています。

最終更新

[OK]を、私は最終的に構成されたベクトルの配列を返すコード片の下に、この思い付いたので、後に多くの論争:

["root link address" "link"] 
["http://www.google.co.uk" "http://www.google.co.uk/examplelink"] 

コード:

(defn get-links 
    [url] 
    (map #(vector url %)(map :href (map :attrs (html/select (fetch-url url) [:a]))))) 

コードは現在私のプロフィールで利用可能な私のgithub上にあります。

+0

元の質問を完全に誤解しましたが、私は自分の答えを削除します。 –

+0

あなたの答えは適切だと思います。最初に尋ねたさまざまなデータ構造の作業に関する関連情報を追加しました。 – Dale

+0

私はそれを元に戻しました。それが有用であると分かったら他の人も同様にそうかもしれません。私はあなたが今何かを考えることができないので、必要なデータ構造についてのあなたの具体的な質問に対する答えを得ることを願っています。 –

答えて

1

私はあなたがツリータイプの構造またはフラットな構造の使用を混乱させていると思います。

[ {:root nil :link "A.COM"} {:root nil :link "B.COM"} ] 

は今、あなたはそれ以上のマップとあなたのget-link方法を使用して、あなたが得る:

[ [ {:root nil :link "A.COM"} {:root "A.COM" :link "Aa.COM"} {:root "A.COM" :link "Ab.COM"} ] [ {:root nil :link "B.COM"} {:root "B.COM" :link "Ba.COM"} {:root "B.COM" :link "Bb.COM"}] ] 

は今、あなたは上flattenを呼び出すことができ あなたがマップのベクトルとしてリンクのリストを持っているとしましょうこの結果はベクトルのネストされたマップではなくリンクのフラットなリストを取得します。

出口の条件が満たされるまで、このプロセスを再帰的に繰り返すことができます。