私は、怠惰なseqsが常にチャンクされているという印象を受けました。Clojureでは、怠惰なseqsは常にチャンクされていますか?
=> (take 1 (map #(do (print \.) %) (range)))
(................................0)
range
によって返さ怠惰配列は32の素子チャンクにチャンクされているため、期待32個のドットが印刷されるように。
=> (take 1 (map #(do (print \.) %) (get-rss-feeds r)))
(."http://wholehealthsource.blogspot.com/feeds/posts/default")
一つだけのドットが印刷されるので、私はget-rss-feeds
によって返さ怠惰-seqのがチャンクされていないと思います。代わりにrange
の私は私自身の機能get-rss-feeds
でこれをしようとすると、しかし、怠惰な配列はもはやチャンクされません。実際:ここ
=> (chunked-seq? (seq (range)))
true
=> (chunked-seq? (seq (get-rss-feeds r)))
false
はget-rss-feeds
のソースです:
(defn get-rss-feeds
"returns a lazy seq of urls of all feeds; takes an html-resource from the enlive library"
[hr]
(map #(:href (:attrs %))
(filter #(rss-feed? (:type (:attrs %))) (html/select hr [:link])))
だから、chunkinessは怠惰な配列が生成される方法に依存していることが表示されます。私は関数range
のソースを覗き込んでいて、それが「かっこいい」方法で実装されているというヒントがあります。だから私はこのことがどのように動作するかについて少し混乱している。誰かが明確にしてもらえますか?
私が知る必要があるのはここです。
私は、次のコードを持っている:(get-rss-entry (get-rss-feeds h-res) url)
は
get-rss-feeds
への呼び出しは、私が検討する必要があるフィードのURLの怠惰なシーケンスを返します。
get-rss-entry
を呼び出すと、特定のエントリ(:linkフィールドがget-rss-entryの2番目の引数と一致する)が検索されます。 get-rss-feeds
によって返される遅延シーケンスを調べます。各アイテムを評価するには、ネットワーク経由で新しいRSSフィードを取得するためのHTTPリクエストが必要です。 HTTPリクエストの数を最小限に抑えるには、シーケンスを1つずつ調べて、一致するとすぐに停止することが重要です。ここ
コードである:
(defn get-rss-entry
[feeds url]
(ffirst (drop-while empty? (map #(entry-with-url % url) feeds))))
entry-with-url
一致がない場合マッチの遅延シーケンスまたは空のシーケンスを返します。
これをテストしたところ、正しく動作しているようです(一度に1つのフィードURLを評価する)。しかし、私はどこかで、どうにかして "かすかな"やり方で行動し始め、一度に32のフィードを評価し始めると心配しています。私はavoid chunky behavior as discussed hereへの道があることを知っていますが、この場合でも必要ないようです。
私は怠惰なseqを非イディオムで使っていますか?ループ/再発はより良い選択肢になりますか?
順序が唯一の「チャンク」あなたは 'clojure.core'および/またはあなたの順序で様々なチャンク機能を使用する場合は、' IChunk'を実装していることが表示されます'IChunkedSeq'インターフェース。現在(1.4.0)、これらは文書化されていません。 – noahlz
あなたはどのバージョンのclojureを使用していますか? –
私はClojure v1.4を使用しています –