[英]Web retrieval to Lazy string error on clojure
我打算檢索一個大網頁並在Clojure上嘗試這個
(defn fetch-url [url]
"Retrieves the web page specified by the url."
(with-open [the-stream (.openStream (java.net.URL. url))]
(let [reader (new BufferedReader (new InputStreamReader the-stream))]
(repeatedly (str (.read reader))))))
當我嘗試獲取函數結果的first
或任何seq運算符時,它給出了以下錯誤:
java.lang.RuntimeException: java.lang.ClassCastException: java.lang.String cannot be cast to clojure.lang.IFn (repl-1:2)
此外,使用line-seq不起作用,因為(我認為)頁面持續過多的加載。
我想創建一個惰性字符串,因為只創建一個字符串就可以解決堆空間錯誤。 我怎么能做到這一點?
當前的問題是,重復地期望一個函數,並且你給出了(str(....))的結果,即String。 為了讓Clojure滿意,你需要在“fn”中“打包”對“str”的調用:
(repeatedly (fn [] (str (.read reader)))))
更好的解決方案是使用slurp或slurp *(后者在contrib IIRC中),或者至少檢查它是如何編寫的。
[編輯]在clojure中沒有“懶字”這樣的東西。 Clojure字符串只是java字符串。 Clojure有懶惰的序列,所以你可以嘗試使用它們,但你必須與結束流戰斗。
或者,您可以使用以下方法(偽代碼):
(defn process-url [url proc-fn]
(with-open [the-stream ...]
(loop [c (.read r)]
(if-not (neg? c)
(proc-fn (char c)))))
這將調用您在每個讀取字符上作為第二個arg傳遞的函數。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.