Clojure使用ref和alter进行多线程状态

时间:2014-10-21 00:50:50

标签: clojure

我正在尝试做一些微不足道的事情,使用代理计算一些东西,如果最终代理值小于某个ref变量,则更新ref变量。

我无法找到将ref变量更新为" swap"。

的方法
(def shortest (ref [1 2 3 4 5])
(def var1 (ref [[1 2 3]]))
(def transfer [avar]
    (dosync
         (if (< (count var1) (count shortest)
             (alter shortest @avar); or whatever is appropriate!
         )
    )

) 
我认为交换了!会工作,但只适用于原子。 (我不确定它会起作用)

1 个答案:

答案 0 :(得分:3)

如果您只想在ref中添加值,则

ref-set非常有用。

user> (def shortest (ref [1 2 3 4 5]))
#'user/shortest
user> (def var1 (ref [1 2 3]))
#'user/var1

功能需要defn而不是def

user> (defn transfer [avar]
        (dosync
         (if (< (count @avar) (count @shortest)) ;; use @ to use the value in the ref
           (ref-set shortest @avar)))) ;; did you intend to use avar here?
#'user/transfer

现在要测试一下:

user> @shortest
[1 2 3 4 5]
user> (transfer var1)
[1 2 3]
user> @shortest
[1 2 3]