したがって、私の 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 に変換します。しかし、実行すると、swap! という行が表示されます。爆発します:
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 に引数を渡さなければ、エラーが発生します。しかし、私は引数を使用しないので、これは醜いです。私はこれを間違って書いているに違いないですよね?