On Thu, May 20, 2010 at 10:40 AM, Rasmus Svensson <[email protected]> wrote:
> 2010/5/10 Anders Rune Jensen <[email protected]>
>>
>> [...] But I was a little surprised to find out that by
>> default, if you don't return anything, it will set the value of the
>> agent to nil. [...]
>
> Firstly, all clojure functions always return something. Some forms, such as
> 'cond' and 'when', return nil as a default value. So yes, the new state of
> the agent will be nil, since nil is the there-is-no-value value.
Yes. I'm just saying that it leads to not-very-pretty code.
> This is my understanding of agents: Agents, like their cousins var, atom and
> ref, is a way of handling state change. The 'send' and 'send-off' functions
> are very much like the 'swap!' of atoms and 'alter' of refs in that they
> take a state transition function, that when given the current state yields
> the next state. Only in this case, the state transition happens
> asynchronously in another thread. The points is that agents are a mechanism
> for managing state change.
>
> When using agents simply for the purpose of executing code in another
> thread, one could also use 'future'. Even though the name suggests that one
> has the option to fetch the result of the future expression later on, one
> doesn't have to. 'future' is equally fitted for
> run-in-another-thread-and-forget usage.
The only thing I'm trying to do is to make a macro that makes it
easier (meaning in this case: better code and less bugs) to use
agents. Nothing else.
I think an example is in place, this is probably a bad example but
should illustrate the point:
state:
:value 11
:message "no danger"
The algorithm:
(defn change-state [cur-state]
(when (> (:value cur-state) 10)
(assoc cur-state :message "danger, danger")))
How I'd have to write it when using an agent:
(defn change-state [cur-state]
(cond (> (:value cur-state) 10)
(assoc cur-state :message "danger, danger")
:else cur-state))
This is a trivial example, but once you have a more complex
state-change this "having-to-remember-to-cover-all-branches" gets
quite bothersome.
> // raek
>
> --
> You received this message because you are subscribed to the Google
> Groups "Clojure" group.
> To post to this group, send email to [email protected]
> Note that posts from new members are moderated - please be patient with your
> first post.
> To unsubscribe from this group, send email to
> [email protected]
> For more options, visit this group at
> http://groups.google.com/group/clojure?hl=en
--
Anders Rune Jensen
http://www.iola.dk
--
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to [email protected]
Note that posts from new members are moderated - please be patient with your
first post.
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en