簡體   English   中英

Clojure STM簡單程序

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM