Hi t x and Jan,
what about performing the side effect part of the function adding a watch? 
(They are no more in alpha with the upcoming 1.6.)

Cheers,
Luca

Il giorno lunedì 17 febbraio 2014 09:29:57 UTC+1, t x ha scritto:
>
> Hi Jan, 
>
>   Thanks for your explanations. 
>
>   I have no idea how I managed to completely misunderstand 
> clojure/atom for the past few years -- I suspect it's because I never 
> use clojure/STM, and as a result, I've never had an atom roll back on 
> me. 
>
>   I've decided to switch to agents. 
>
>   Thanks again for catching this fundamental error. 
>
>
>
> On Sun, Feb 16, 2014 at 11:00 PM, Jan Herich 
> <jan.h...@gmail.com<javascript:>> 
> wrote: 
> > Hi t x, 
> > 
> > I think, that lock-free approach an it's semantics is more in line with 
> > other Clojure reference types such as refs. 
> > It also encourages you to only use pure functions for state transitions, 
> > among other things, such as significant 
> > performance benefits in comparison with lock based approaches, see for 
> > example this article. 
> > If you really want to update some reference with function which will 
> also 
> > perform "impure" actions such as file I/O, 
> > consider using agents and send or send-off (the latter in case of I/O 
> > blocking actions), functions given to send 
> > and send-off are guaranteed to run only once. 
> > 
> > Dňa pondelok, 17. februára 2014 2:36:59 UTC+1 t x napísal(-a): 
> >> 
> >> Hi Jan, 
> >> 
> >>   You're right. I'm wrong. 
> >> 
> >>   I'm grateful you pointed this out -- this would have otherwise been 
> >> impossible to debug. 
> >> 
> >> =========================== 
> >> 
> >> To everyone: 
> >> 
> >>   Why can swap! be retried? This confuses me -- to implement swap!, why 
> >> can't we 
> >> 
> >>   * have a lock 
> >> 
> >>   * ensure that only one swap! is in session at any given time 
> >> 
> >>   * have the given swap! complete before running the next swap! 
> >> 
> >> 
> >> Thanks! 
> >> 
> >> 
> >> On Sun, Feb 16, 2014 at 3:51 PM, Jan Herich <jan.h...@gmail.com> 
> wrote: 
> >> > I'm afraid your understanding of atom swap! operations is not quite 
> >> > correct 
> >> > -> update function must (or should) be pure as well. 
> >> > See the documentation for swap!, update function could be potentially 
> >> > called 
> >> > multiple times if there are more threads of execution 
> >> > updating one atomic reference -> there is simple compare and set 
> >> > mechanism 
> >> > involved, which compares the old value of the atom 
> >> > (input for the update function) and sets the atom to new value 
> (return 
> >> > value 
> >> > from the update function) only value of the atom reference 
> >> > was not changed in between, if yes the compare and set is retried 
> until 
> >> > ti 
> >> > succeeds. 
> >> > 
> >> > Dňa nedeľa, 16. februára 2014 23:35:24 UTC+1 t x napísal(-a): 
> >> >> 
> >> >> I believe that's the STM approach, which has the advanrtage of: 
> >> >> 
> >> >>   * can synchronize across multiple pieces of data 
> >> >> 
> >> >> but has the disadvantage of: 
> >> >> 
> >> >>   * work must be "pure" since it can be retried 
> >> >> 
> >> >>   * possibly less efficient due to possibility of retrying 
> >> >> 
> >> >> 
> >> >> In the example I posted above, I only need to: 
> >> >> 
> >> >>   * modify a single atom 
> >> >> 
> >> >> and the approach I presented above: 
> >> >> 
> >> >>   * can be impure, since it is guaranteed to only run once 
> >> >> 
> >> >>   * is guaranteed to succeed (without retrys) 
> >> >> 
> >> >> On Sun, Feb 16, 2014 at 2:25 PM, Ramesh <ramesh1...@gmail.com> 
> wrote: 
> >> >> > You can use a ref instead of an atom. And use dosync with multiple 
> >> >> > alter, so 
> >> >> > everything is safely inside a transaction. 
> >> >> > 
> >> >> > On Feb 16, 2014 2:04 PM, "t x" <txre...@gmail.com> wrote: 
> >> >> >> 
> >> >> >> Hi John, 
> >> >> >> 
> >> >> >>   Your solution is perfectly valid and optimal for the problem I 
> >> >> >> described above. 
> >> >> >> 
> >> >> >> 
> >> >> >>   Unfortunately, I forgot to mention an additional constraint: 
> >> >> >> sometimes I 
> >> >> >> do: 
> >> >> >> 
> >> >> >> (let [ foo (:some-selector @data-atom) ] 
> >> >> >>   (swap! data-atom update-in [:other-selector] ... )) 
> >> >> >> 
> >> >> >> which the -> doesn't quite work on, but my ugly hack above does 
> >> >> >> resolve. 
> >> >> >> 
> >> >> >> 
> >> >> >>   The problem being -- I want to update one part of the atom, but 
> it 
> >> >> >> depends on another part of the atom. 
> >> >> >> 
> >> >> >>   I ended up with the following hack: 
> >> >> >> 
> >> >> >> (defn tswap! [atm func] 
> >> >> >>   (swap! atm 
> >> >> >>          (fn [old] 
> >> >> >>            (let [natm (atom old)] 
> >> >> >>              (func natm) 
> >> >> >>              @natm)))) 
> >> >> >> 
> >> >> >> 
> >> >> >> On Sat, Feb 15, 2014 at 4:09 PM, John D. Hume <
> duelin....@gmail.com> 
> >> >> >> wrote: 
> >> >> >> > On Sat, Feb 15, 2014 at 6:04 PM, t x <txre...@gmail.com> 
> wrote: 
> >> >> >> >> 
> >> >> >> >> 
> >> >> >> >> (defn what-I-want [] 
> >> >> >> >>   (with-atom some-atom 
> >> >> >> >>     assoc-in ... 
> >> >> >> >>     assoc-in ... 
> >> >> >> >>     update-in ...)) 
> >> >> >> > 
> >> >> >> > 
> >> >> >> > I often do something like this and don't find it too ugly: 
> >> >> >> > (swap! my-atom #(-> % 
> >> >> >> >                   (assoc-in [:k] v) 
> >> >> >> >                   (update-in [:k2] inc) 
> >> >> >> >                   ,,,)) 
> >> >> >> > 
> >> >> >> > -- 
> >> >> >> > You received this message because you are subscribed to the 
> Google 
> >> >> >> > Groups "Clojure" group. 
> >> >> >> > To post to this group, send email to clo...@googlegroups.com 
> >> >> >> > Note that posts from new members are moderated - please be 
> patient 
> >> >> >> > with 
> >> >> >> > your 
> >> >> >> > first post. 
> >> >> >> > To unsubscribe from this group, send email to 
> >> >> >> > clojure+u...@googlegroups.com 
> >> >> >> > For more options, visit this group at 
> >> >> >> > http://groups.google.com/group/clojure?hl=en 
> >> >> >> > --- 
> >> >> >> > You received this message because you are subscribed to the 
> Google 
> >> >> >> > Groups 
> >> >> >> > "Clojure" group. 
> >> >> >> > To unsubscribe from this group and stop receiving emails from 
> it, 
> >> >> >> > send 
> >> >> >> > an 
> >> >> >> > email to clojure+u...@googlegroups.com. 
> >> >> >> > For more options, visit 
> https://groups.google.com/groups/opt_out. 
> >> >> >> 
> >> >> >> -- 
> >> >> >> You received this message because you are subscribed to the 
> Google 
> >> >> >> Groups "Clojure" group. 
> >> >> >> To post to this group, send email to clo...@googlegroups.com 
> >> >> >> Note that posts from new members are moderated - please be 
> patient 
> >> >> >> with 
> >> >> >> your first post. 
> >> >> >> To unsubscribe from this group, send email to 
> >> >> >> clojure+u...@googlegroups.com 
> >> >> >> For more options, visit this group at 
> >> >> >> http://groups.google.com/group/clojure?hl=en 
> >> >> >> --- 
> >> >> >> You received this message because you are subscribed to the 
> Google 
> >> >> >> Groups 
> >> >> >> "Clojure" group. 
> >> >> >> To unsubscribe from this group and stop receiving emails from it, 
> >> >> >> send 
> >> >> >> an 
> >> >> >> email to clojure+u...@googlegroups.com. 
> >> >> >> For more options, visit https://groups.google.com/groups/opt_out. 
>
> >> >> > 
> >> >> > -- 
> >> >> > You received this message because you are subscribed to the Google 
> >> >> > Groups "Clojure" group. 
> >> >> > To post to this group, send email to clo...@googlegroups.com 
> >> >> > Note that posts from new members are moderated - please be patient 
> >> >> > with 
> >> >> > your 
> >> >> > first post. 
> >> >> > To unsubscribe from this group, send email to 
> >> >> > clojure+u...@googlegroups.com 
> >> >> > For more options, visit this group at 
> >> >> > http://groups.google.com/group/clojure?hl=en 
> >> >> > --- 
> >> >> > You received this message because you are subscribed to the Google 
> >> >> > Groups 
> >> >> > "Clojure" group. 
> >> >> > To unsubscribe from this group and stop receiving emails from it, 
> >> >> > send 
> >> >> > an 
> >> >> > email to clojure+u...@googlegroups.com. 
> >> >> > For more options, visit https://groups.google.com/groups/opt_out. 
> >> > 
> >> > -- 
> >> > You received this message because you are subscribed to the Google 
> >> > Groups "Clojure" group. 
> >> > To post to this group, send email to clo...@googlegroups.com 
> >> > Note that posts from new members are moderated - please be patient 
> with 
> >> > your 
> >> > first post. 
> >> > To unsubscribe from this group, send email to 
> >> > clojure+u...@googlegroups.com 
> >> > For more options, visit this group at 
> >> > http://groups.google.com/group/clojure?hl=en 
> >> > --- 
> >> > You received this message because you are subscribed to the Google 
> >> > Groups 
> >> > "Clojure" group. 
> >> > To unsubscribe from this group and stop receiving emails from it, 
> send 
> >> > an 
> >> > email to clojure+u...@googlegroups.com. 
> >> > For more options, visit https://groups.google.com/groups/opt_out. 
> > 
> > -- 
> > You received this message because you are subscribed to the Google 
> > Groups "Clojure" group. 
> > To post to this group, send email to clo...@googlegroups.com<javascript:> 
> > Note that posts from new members are moderated - please be patient with 
> your 
> > first post. 
> > To unsubscribe from this group, send email to 
> > clojure+u...@googlegroups.com <javascript:> 
> > For more options, visit this group at 
> > http://groups.google.com/group/clojure?hl=en 
> > --- 
> > You received this message because you are subscribed to the Google 
> Groups 
> > "Clojure" group. 
> > To unsubscribe from this group and stop receiving emails from it, send 
> an 
> > email to clojure+u...@googlegroups.com <javascript:>. 
> > For more options, visit https://groups.google.com/groups/opt_out. 
>

-- 
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to clojure@googlegroups.com
Note that posts from new members are moderated - please be patient with your 
first post.
To unsubscribe from this group, send email to
clojure+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en
--- 
You received this message because you are subscribed to the Google Groups 
"Clojure" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to clojure+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/groups/opt_out.

Reply via email to