【问题标题】:Clojure using ref and alter for multi-thread statesClojure 使用 ref 和 alter 处理多线程状态
【发布时间】:2014-10-21 00:50:49
【问题描述】:

我正在尝试做一些微不足道的事情,使用代理计算一些东西,如果最终代理值小于某个 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!
         )
    )

) 

我想交换!会起作用,但这仅适用于原子。 (我不确定它会起作用)

【问题讨论】:

    标签: clojure


    【解决方案1】:

    ref-set 如果您只想在 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
    

    现在来测试一下:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-10-17
      • 2012-03-17
      • 1970-01-01
      • 2012-10-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多