簡體   English   中英

對clojure的Web檢索到Lazy字符串錯誤

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM