Avevo l'impressione che i pigri seq fossero sempre frammentati.In Clojure, i seq pigri sono sempre misti?
=> (take 1 (map #(do (print \.) %) (range)))
(................................0)
come previsto 32 punti sono stampati perché la ss pigri restituito da range
è chunked in 32 blocchi di elementi. Tuttavia, quando invece di range
provo questo con la mia propria funzione get-rss-feeds
, la ss pigro non è più Chunked:
=> (take 1 (map #(do (print \.) %) (get-rss-feeds r)))
(."http://wholehealthsource.blogspot.com/feeds/posts/default")
un solo punto viene stampato, quindi credo che il pigro-seq restituito da get-rss-feeds
non è chunked. Infatti:
=> (chunked-seq? (seq (range)))
true
=> (chunked-seq? (seq (get-rss-feeds r)))
false
Ecco la fonte per 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])))
Così sembra che chunkiness dipende da come viene prodotta la ss pigro. Ho dato una sbirciata alla fonte per la funzione range
e ci sono suggerimenti che sono stati implementati in modo "massiccio". Quindi sono un po 'confuso su come funziona. Qualcuno può chiarire?
Ecco perché ho bisogno di sapere.
devo seguente codice: (get-rss-entry (get-rss-feeds h-res) url)
La chiamata a get-rss-feeds
restituisce una sequenza pigro di URL di feed che ho bisogno di esaminare.
La chiamata a get-rss-entry
cerca una voce specifica (cui: campo di collegamento corrisponde al secondo argomento di get-rss-entry). Esamina la sequenza lenta restituita da get-rss-feeds
. La valutazione di ciascun articolo richiede una richiesta HTTP attraverso la rete per scaricare un nuovo feed RSS. Per ridurre al minimo il numero di richieste http, è importante esaminare la sequenza una per una e fermarsi non appena c'è una corrispondenza.
Ecco il codice:
(defn get-rss-entry
[feeds url]
(ffirst (drop-while empty? (map #(entry-with-url % url) feeds))))
entry-with-url
restituisce una sequenza di partite pigro o una sequenza vuota se non v'è alcuna corrispondenza.
Ho provato questo e sembra funzionare correttamente (valutare un URL di feed alla volta). Ma sono preoccupato che da qualche parte, in qualche modo comincerà a comportarsi in modo "grosso" e inizierà a valutare 32 feed alla volta. So che c'è un modo per avoid chunky behavior as discussed here, ma non sembra nemmeno essere richiesto in questo caso.
Sto usando lazy seq non in modo idiomatico? Ciclo/ricorrenza sarebbe una soluzione migliore?
sembra che una sequenza è solo "Chunked" se si utilizzano le varie funzioni chunk in 'clojure.core' e/o la sequenza implementa il' IChunk' e Interfacce 'IChunkedSeq'. Attualmente (in 1.4.0), questi non sono documentati. – noahlz
quale versione del clojure stai usando? –
Sto usando Clojure v1.4 –