On 17 December 2016 at 22:13, Rafo Ufoun <raf.develo...@gmail.com> wrote:

> I'm a real newbe to clojure and functionnal programming but reading your
> answer raised a question :
>
> Where do you "store" the stopwatch object which you are passing to all
> your functions ?
>
> I understand that mutability is not needed to develop the functions you
> described but all of them take a stopwatch as as an argument. This
> stopwatch must be stored somewhere to call these functions against ?
>

Sure. At its simplest you could just store the stopwatch as a local
binding. For example, lets say we create an input loop:

  (loop [stopwatch zeroed-stopwatch]
    (wait-for-button)
    (if (started? stopwatch)
      (let [stopped-stopwatch (stop stopwatch)]
        (println (elapsed stopped-stopwatch))
        (recur stopped-stopwatch)
      (recur (start stopwatch))))

The state of the stopwatch is stored as a loop variable. If we didn't want
an infinite loop, we could use a let form instead to similar effect.

If we have a more traditional GUI, then we have to communicate across
threads, and for that we'd use an atom (or possible a ref):

  (let [stopwatch (atom zeroed-stopwatch]
    (on-click button (fn [evt] (swap! stopwatch toggle))
    (on-tick label (fn [evt] (set-text label (elapsed @stopwatch))))

Does that make things clearer?

- James

-- 
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/d/optout.

Reply via email to