我正在尝试做一些微不足道的事情,使用代理计算一些东西,如果最终代理值小于某个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!
)
)
)
我认为交换了!会工作,但只适用于原子。 (我不确定它会起作用)
答案 0 :(得分:3)
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]