Hi,

On Aug 5, 4:18 pm, michele <michelemen...@gmail.com> wrote:
> ORIGINAL
>
> (defn update-positions [snake apple]
>   (dosync
>     (if (eats? @snake @apple)
>       (do (ref-set apple (create-apple))
>         (alter snake move :grow))
>      (alter snake move)))
> nil)
>
> WITHOUT do
>
> (defn update-positions [snake apple]
>   (dosync
>     (if (eats? @snake @apple)
>       ((ref-set apple (create-apple))    <------ Removed "do" from
> here
>         (alter snake move :grow))
>      (alter snake move)))
> nil)
>
> Both versions work, so why does the "do" on line 4 contribute?

It is an accident that the second version works. Probably create-apple
returns a map. Replacing (create-apple) with - say - 5, should trigger
an exception.

The do is required, because you can have only one expression for the
then-branch or the else-branch in an if. If you want to have several
expressions in a branch you need a do, which executes each expression
in a row and returns the value of the last one. So this is mostly
useful for side effects.

In the example the side effects are the calls to ref-set and alter.

Hope this helps.

Sincerely
Meikel

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

Reply via email to