My latest iteration has brought me to this:

https://github.com/jimpil/bankio/blob/master/src/bankio/core.clj

If anyone can think of a more evident and safe approach for demonstration purposes, by all means, shout out. After consulting the Clojure Programming book, I decided to use commute for simply depositing in to an account. There are still 2 fns that use dosync but only modify a single identity, namely deposit! & withdraw!. I don't see how else this can be done since they are refs. I would appreciate feedback for this (hopefully) last version...


many thanks in advance :)

Jim


On 21/11/13 13:19, John D. Hume wrote:

If you want to demonstrate STM with the deposit-withdraw-transfer example, you definitely need a ref for each account.

I'd suggest an atom for the account-num->balance-ref map ("the bank") and an atom for the account-num-generator, but you say coordination is necessary for opening and closing accounts. What coordination do you have in mind?

On Nov 21, 2013 5:27 AM, "Jim - FooBar();" <jimpil1...@gmail.com <mailto:jimpil1...@gmail.com>> wrote:

    also I forgot to add that having the bank in some reference type
    allows opening/closing new accounts, an operation that at least to
    me sounds like it needs coordination...
    So which way is preferred? map-ref that stores values, map that
    stores refs or map-ref that stores refs?

    Jim


    On 21/11/13 10:58, Jim - FooBar(); wrote:

        Hi Stefan,

        thanks for your interest. let me explain further...

        1. I did start with a design that involved a map (the bank)
        full of agents (accounts). Then I switched to a map full of
        atoms thinking that I don't really need asynchronous
        operations. I settled to the single ref approach because it
        seemed like an overkill to have all these refs inside. Your
        comment however does make sense...Since there is a single
        identity, perhaps STM is an overkill...

        2. can you ellaborate why you think this is debatable? All the
        ref-managing fns return the in-transaction value of the ref
        (i.e. 'alter'). My problem was with 'doseq' which returns nil
        so I followed the general approach of returning the
        in-transaction value of the ref after it commits.

        3. As I understand it these 2 transactions will be
        composed/merged into a single transaction. Again, originally I
        had a bare 'alter' (no dosync) on the private fn transfer1
        simply because it is hidden and not supposed to be
        used...think of it as a helper fn for 'transfer'. but then I
        read somewhere that transaction can be nested without a
        problem so I thought it is safer to include 'dosync' in
        tranfer1 as well...

        I'm not getting you wrong, don't worry...this is the reason I
        started this thread - need some answers /feedback :)

        Jim


        On 21/11/13 10:42, Stefan Kamphausen wrote:

            Hi,

            I may be missing something here, since this thread leaves
            me a bit confused.

            1. Why are you using a Ref for the bank in the first
            place?  It is a single identity and thus should be an
            atom, because you do not need to coordinate changes of at
            least two identities.

            If I am not mistaken, the generic bank transfer example is
            to have a Ref for each of the accounts and to make sure,
            that there is never a state of the world in which the
            money is missing or is available twice.

            2. "Even our side-effecting fns return something (per
            alter) which is good." -> That seems debatable to me.

            3. Why do you nest transactions on the same Ref in
            transfer1 and transfer?

            Don't get me wrong, what you're doing may be fine.  In
            that case, I just don't get it.  Which, in turn, may be a
            relevant feedback to you, since this is to be educational :-)


            Kind regards,
            Stefan


-- -- 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 <mailto: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
            <mailto:clojure%2bunsubscr...@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
            <mailto:clojure%2bunsubscr...@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
    <mailto: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
    <mailto:clojure%2bunsubscr...@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
    <mailto:clojure%2bunsubscr...@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