5

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-server 内で add-to-logged-in-registry への呼び出しがあります。

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

この最後の行は私にこのエラーを与えます:

スレッド「メイン」での例外 java.lang.IllegalArgumentException: ISeq の作成方法がわかりません: java.lang.Long at clojure.lang.RT.seqFrom(RT.java:487) at clojure.lang.RT.seq (RT.java:468) at clojure.lang.APersistentMap.cons(APersistentMap.java:39) at clojure.lang.RT.conj(RT.java:544) at 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. who_is_logged_in.core$run_server.invoke(core.clj:52) で core$listen_and_respond.invoke(core.clj:42) (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]
4

1 に答える 1

6

conj は、要素を追加するコレクションのタイプに応じて異なる動作をします。最初の例では、要素をマップに追加しており、コレクションにキーと値が必要です。REPL の例では、要素をベクターに追加しており、単一の値のみが必要です。

swap!マップに ing:

(def registry (atom{}))
(let [moments (java.util.Date.)
  right-now (.getTime moments)]                                                 
  (swap! registry conj [:time right-now]))
{:time 1345700872898}  
于 2012-08-23T05:36:26.580 に答える