Clojure China

第一次用原子,不知道出了什么问题

#1

我想从控制台输入数字,输入到-1时退出,并把这些数字存储在映射dict中
下面是我单独用一个原子代码

(def dict (atom {}))

(defn foo []
  (loop [n (read-line) m 1]
    (if (not= "-1" n)
      (do
        (swap! dict assoc m (Integer/parseInt n))
        (recur (read-line) (inc m)))))

调用函数并在控制台输入数字1 2 3 4 -1(输入每个后回车),对dict解引用
@dict
{1 1, 2 2, 3 3, 4 4}

其实第一次想到的使用两个原子

(def dict (atom {}))
(def mynum (atom 0))
(defn foo []
  (loop [n (read-line)]
    (if (not= "-1" n)
      (do
        (swap! mynum inc)
        (swap! dict assoc mynum (Integer/parseInt n))
        (recur (read-line))))))

但我调用时却发现解引用dict
@dict
{#object[clojure.lang.Atom 0x4b9a9d8a {:status :ready, :val 4}] 4}
也就是说dict只传入了最后的mynum
另外我还发现就算把mynum和dict设置为ref也是这个结果,agent也一样,
请问我这个代码有没有哪里不对的地方??

#2

由于 mynum 是个 Atom, 一般会通过 @mynum 去读取最新的值, 直接把 Atom 当成 key 貌似没看到这么用过.

(swap! dict assoc mynum (Integer/parseInt n))

另外 Atom 的变量习惯上用命名方式区分, 比如 my-num*, 后面加星号. 或者用 num-ref 或者 *num 也差不多…

#3

原来昨天写错了,是@mynum啊