【问题标题】:Clojure error when calling swap! on atom, trying 'conj this-number'调用交换时出现 Clojure 错误!在原子上,尝试 'conj this-number'
【发布时间】:2012-08-23 05:21:55
【问题描述】:

我想要一个原子中的映射,它可以跟踪时间作为 Unix 时间戳。

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

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

在运行服务器内部,我调用了 add-to-logged-in-registry:

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

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

线程“main”中的异常 java.lang.IllegalArgumentException:不知道如何从 java.lang.Long 创建 ISeq 在 clojure.lang.RT.seqFrom(RT.java:487) 在 clojure.lang.RT.seq(RT.java:468) 在 clojure.lang.APersistentMap.cons(APersistentMap.java:39) 在 clojure.lang.RT.conj(RT.java:544) 在 clojure.core$conj.invoke(core.clj:83) 在 clojure.lang.Atom.swap(Atom.java:51) 在 clojure.core$swap_BANG_.invoke(core.clj:2107) 在 who_is_logged_in.core$add_to_logged_in_registry.invoke(core.clj:39) 在 who_is_logged_in.core$listen_and_respond.invoke(core.clj:42) 在 who_is_logged_in.core$run_server.invoke(core.clj:52) 在 who_is_logged_in.core$_main.doInvoke(core.clj:76) 在 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]

【问题讨论】:

    标签: clojure


    【解决方案1】:

    conj 的行为取决于它添加元素的集合类型。在您的第一个示例中,它正在向地图添加元素,并且需要集合中的键和值。在您的 REPL 示例中,它正在向向量添加元素,并且只需要一个值。

    swap!进入地图:

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

    【讨论】:

    • 和一个例子来说明它为什么想要一个集合。我使用矢量是因为我喜欢它的外观,尽管其他工作都很好
    • @cerhovice 我认为将 cmets 添加到问题只会通知回答者,将它们添加到问题会通知提问者
    猜你喜欢
    • 1970-01-01
    • 2021-11-03
    • 1970-01-01
    • 1970-01-01
    • 2013-09-07
    • 2011-07-30
    • 1970-01-01
    • 2022-06-15
    • 1970-01-01
    相关资源
    最近更新 更多