gpt4 book ai didi

clojure - 交换! atom 然后是 : java. lang.ClassCastException : java. lang.String 不能转换为 clojure.lang.IFn

转载 作者:行者123 更新时间:2023-12-04 05:33:57 24 4
gpt4 key购买 nike

所以,在我的 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”定义的变量作为字符串)但最终我想将此变量发送到多个线程,因此我需要将其作为原子或代理。

我做错了什么?

更新:

杰里米·海勒,谢谢。已修复,但结果丑陋如罪:
(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 提供一个参数,否则我会收到错误消息。但我不使用这个论点,所以这很丑陋。我一定写错了,是吗?

最佳答案

您需要将函数传递给 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)))

关于clojure - 交换! atom 然后是 : java. lang.ClassCastException : java. lang.String 不能转换为 clojure.lang.IFn,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12205996/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com