Clojure对多线程状态使用ref和alter

Clojure对多线程状态使用ref和alter,clojure,Clojure,我试图做一些琐碎的事情,使用代理计算一些东西,如果最终代理值小于某个ref变量,则更新ref变量 我无法找到将ref变量更新为“swap”的方法 (定义最短(参考[1 2 3 4 5]) (def var1(参考[1 2 3]])) (def传输[avar] (dosync) (如果(

我试图做一些琐碎的事情,使用代理计算一些东西,如果最终代理值小于某个ref变量,则更新ref变量

我无法找到将ref变量更新为“swap”的方法

(定义最短(参考[1 2 3 4 5])
(def var1(参考[1 2 3]]))
(def传输[avar]
(dosync)
(如果(<(计数变量1)(计数最短)
(alter shortest@avar);或任何合适的!
)
)
) 
我认为swap!可以工作,但这仅适用于atom。(我不确定它是否可以工作)

如果您只想在ref中输入一个值,那么它很有用

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
如果您只想在ref中输入一个值,则此函数非常有用

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
如果您只想在ref中输入一个值,则此函数非常有用

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
如果您只想在ref中输入一个值,则此函数非常有用

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