[英]Clojure STM simple program
我正在寫一個簡單的程序,使用Clojure的STM轉換兩個整數的值。 我正在使用Lewandowski的功能a06來遵循Lewandowski( http://lewandowski.io/2016/01/clojure-summary/ )的方法。
我的代碼:
(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”來顯示我的問題。 很抱歉,如果這是我犯的一個非常簡單的錯誤,但是我根本看不到代碼中缺少什么。 每個答案都令人感動! 謝謝!
比較以下各項,它們可以正常工作:
(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)]
(let [f1 (future (trans p1 p2))
f2 (future (trans p1 p2))]
(Thread/sleep 500))
(println (pr-str @p1))
(println (pr-str @p2))))
就是說,當您的興趣是副作用,而不是以后獲取計算結果本身時,期貨並不是真正理想的工具。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.