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.her...@gmail.com> 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 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.

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