2012-08-30 43 views
2

所以,在我core.clj文件我有:交換!原子,然後:java.lang.ClassCastException:java.lang.String中不能轉換到clojure.lang.IFn

(def page-buffer (BufferedReader. (InputStreamReader. (clojure.java.io/input-stream    (clojure.java.io/resource "mitochondria.html")))))  
(def parsed-page (atom "")) 

再後來:

(defn -main [& args] 
(let [port (Integer/parseInt (first args))] 
(swap! parsed-page (with-open [] 
         (.toString (reduce #(.append %1 %2) 
             (StringBuffer.) (line-seq page-buffer))))) 
(println "Server is starting") 
(println "port: " port) 
(run-server port))) 

這個編譯,然後我把它變成uberjar。但是當我運行它時,我得到了交換行!炸燬:

Exception in thread "main" java.lang.ClassCastException: java.lang.String cannot be cast to clojure.lang.IFn 
at clojure.core$swap_BANG_.invoke(core.clj:2106) 
at serve_pages_from_memory.core$_main.doInvoke(core.clj:29) 
at clojure.lang.RestFn.applyTo(RestFn.java:137) 
at serve_pages_from_memory.core.main(Unknown Source) 

我想這不使用原子和一切工作只是罰款(使用「高清」定義的變種是一個字符串),但最終我想這個變種發送給多個線程,所以我需要這是一個原子或代理。

我做錯了什麼?

更新:

傑勒米海勒,謝謝。固定,但結果是醜陋的罪:

(defn parse-buffer [& everything-else] 
(with-open [] 
(.toString (reduce #(.append %1 %2) 
        (StringBuffer.) (line-seq page-buffer))))) 

(defn -main [& args] 
(let [port (Integer/parseInt (first args))] 
(swap! parsed-page parse-buffer) 
(println "Server is starting") 
(println "port: " port) 
(run-server port))) 

我必須給parse-buffer或我得到一個錯誤的參數。但我不使用這個論點,所以這很難看。我必須寫這個錯誤,是的?

回答

3

您需要將一個函數傳遞給swap!。現在你正在傳遞一個值。

(let [foo (atom 1)] 
    (swap! foo + 2) 
    @foo) 

上述表達式將返回3.傳入的函數採用原子的當前值,返回值成爲原子的新值。任何額外的參數傳遞給給定的函數。


要在更新評論:是的,你需要給出一個說法在swap!使用的功能。第一個參數是原子的當前值。但是,您不需要破解parse-buffer以使其工作。你可以用一個匿名函數來包裝它。

此外,parse-buffer可以大大簡化。由於line-seq返回給定閱讀器的一系列行,並且str在內部使用StringBuilder,因此您可以將其應用於序列。

(defn parse-buffer [] 
    (with-open [buf page-buffer] 
    (apply str (line-seq buf)))) 

(defn -main [& args] 
    (let [port (Integer/parseInt (first args))] 
    (swap! parsed-page (fn [cur-val] (parse-buffer))) 
    (println "Server is starting") 
    (println "port: " port) 
    (run-server port))) 
相關問題