所以,在我的 core.clj 文件中,我有:
(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)
我在不使用原子的情况下尝试了这个,一切正常(使用用“def”定义的 var 作为字符串)但最终我想将此 var 发送到多个线程,所以我需要它是一个原子或代理。
我做错了什么?
更新:
杰里米·海勒,谢谢。已修复,但结果很丑陋:
(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 一个参数,否则我会出错。但我不使用这个论点,所以这很难看。我一定是写错了,是吗?