Clojure STM简单程序

时间:2018-12-04 18:26:04

标签: clojure stm

我正在写一个简单的程序,使用Clojure的STM转换两个整数的值。 我正在使用Lewandowski(http://lewandowski.io/2016/01/clojure-summary/)的功能a06。

我的代码:

(defn trans [p1 p2]
  (println "a")
    (dosync
      (let [newval1 (@p1 + 50)
            newval2 (@p2 - 30)]
        (do 
          (println "b")
          (ref-set p1 newval1)
          (ref-set p2 newval2)))))

(defn main []
   (let [p1 (ref 20) p2 (ref 100)]
     (do
       (future (trans p1 p2))
       (future (trans p1 p2))
       (Thread/sleep 500))    
   (println @p1)
   (println @p2))) 

由于某种原因,我的函数主体没有进入函数trans的“执行部分”。因此,我的输出仅为:

a
a
20
100
=> nil

我添加了“ a”和“ b”来显示我的问题。 很抱歉,如果这是我犯的一个非常简单的错误,但是我根本看不到代码中缺少什么。每个答案都令人感动!谢谢!

1 个答案:

答案 0 :(得分:0)

与以下各项进行比较,它们可以正常工作:

sum(hours[1:(length(hours)-1)]==0&hours[2:(length(hours))]!=0)

也就是说,当您的兴趣是副作用时,期货并不是真正理想的工具,而不是以后检索计算本身的结果。