交换atom和then:java.lang.ClassCastException:java.lang.String不能强制转换为clojure.lang.IFn
因此,在我的core.clj文件中,我有:交换atom和then:java.lang.ClassCastException:java.lang.String不能强制转换为clojure.lang.IFn,clojure,Clojure,因此,在我的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 (Integ
(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)
我在没有使用atom的情况下尝试了这个方法,一切都很好(使用一个用“def”定义的变量作为字符串),但最终我想将这个变量发送到多个线程,所以我需要将其作为atom或代理
我做错了什么
更新:
杰里米·海勒,谢谢。修正了,但结果就像罪恶一样丑陋:
(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)))
我必须给出一个参数来解析缓冲区,否则就会出错。但我不使用这个论点,所以这很难看。我一定是写错了,是吗 您需要将函数传递给
交换代码>。现在您正在传递一个值
(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)))