Clojure STM простая программа - PullRequest
0 голосов
/ 04 декабря 2018

Я пишу на простую программу для преобразования значений двух целых чисел, используя STM Clojure.Я следую за приближением Левандовски (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))) 

По какой-то причине моя функция main не попадает в "сделать часть "функции trans. Следовательно, мой вывод только:

a
a
20
100
=> nil

Я добавил" a "и" b ", чтобы показать мою проблему. Извините, если это очень простая ошибка, которую я сделал, ноЯ просто не вижу, чего не хватает в моем коде. Каждый ответ очень ценится! Спасибо!

1 Ответ

0 голосов
/ 04 декабря 2018

Сравните со следующим, что работает правильно:

(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))))

Тем не менее, фьючерсы на самом деле не идеальный инструмент для работы, когда ваш интерес связан с побочным эффектом, а не с последующим поискомРезультат самого расчета.

...