调用swap时出现Clojure错误!在原子上,尝试'​​联合这个数字'

cer*_*ice 5 clojure

我想要一个原子中的地图,可以跟踪时间作为Unix时间戳.

所以,在我的主要功能中,我有:

(defn -main [& args]
(println "Server is starting")
(def port (Integer/parseInt (first args)))
(def registry (atom {}))
(run-server port who-is-here registry))
Run Code Online (Sandbox Code Playgroud)

在运行服务器内部,我调用了添加到登录的注册表:

(defn add-to-logged-in-registry
[registry]
(let [moments (Date.)
    right-now (.getTime moments)]
(swap! registry conj right-now)))
Run Code Online (Sandbox Code Playgroud)

最后一行给出了这个错误:

线程"main"中的异常java.lang.IllegalArgumentException:不知道如何在clojure.lang.RT.seq的clojure.lang.RT.seqFrom(RT.java:487)中创建ISeq:java.lang.Long (RT.java:468)在clojure.lang.APersistentMap.cons(APersistentMap.java:39)的clojure.lang.RT.conj(RT.java:544)clojure.core $ conj.invoke(core.clj: 83)位于who_is_logged_in上的who_is_logged_in.core $ add_to_logged_in_registry.invoke(core.clj:39)的clojure.core $ swap_BANG_.invoke(core.clj:2107)中的clojure.lang.Atom.swap(Atom.java:51).核心$ listen_and_respond.invoke(core.clj:42)at who_is_logged_in.core $ run_server.invoke(core.clj:52)at who_is_logged_in.core $ _main.doInvoke(core.clj:76)at clojure.lang.RestFn.applyTo (RestFn.java:137)who_is_logged_in.core.main(未知来源)

这是什么意思?

当我在emacs的REPL中尝试这个时,这非常有效:

user>  (def registry (atom []))
#'user/registry

user>   (let [moments (Date.)
    right-now (.getTime moments)]
(swap! registry conj right-now))

[1345698128988]

user>   (let [moments (Date.)
    right-now (.getTime moments)]
(swap! registry conj right-now))

[1345698128988 1345698132472]
Run Code Online (Sandbox Code Playgroud)

Art*_*ldt 6

conj的行为有所不同,具体取决于它添加元素的集合类型.在您的第一个示例中,它是向地图添加元素,并且需要A键和集合中的值.在你的REPL示例中,它是向向量添加元素,只需要一个值.

swap!进入地图:

(def registry (atom{}))
(let [moments (java.util.Date.)
  right-now (.getTime moments)]                                                 
  (swap! registry conj [:time right-now]))
{:time 1345700872898}  
Run Code Online (Sandbox Code Playgroud)