On Dec 10, 2016 1:47 AM, "Didier" <[email protected]> wrote:
I'm wondering what everyone thinks of using closures to mimic a simplistic
object system in Clojure? I'm not sure what to think of it yet, but the
idea is that you wrap object fields inside a closed function, and it
returns a map of methods that operates over those fields.
Here's an example of using this pattern to implement a StopWatch:
(import [java.lang System])
(defn new-stopwatch []
(let [start-time (atom nil)
elapsed (atom 0)]
{:start (fn []
(when (nil? @start-time)
(reset! start-time (System/currentTimeMillis))))
:stop (fn []
(when-not (nil? @start-time)
(reset! elapsed
(+ @elapsed
(- (System/currentTimeMillis) @start-time)))
(reset! start-time nil))
@elapsed)
:reset (fn []
(reset! start-time nil)
(reset! elapsed 0)
@elapsed)
:elapsed (fn []
(if-not (nil? @start-time)
(- (System/currentTimeMillis) @start-time)
@elapsed))}))
(let [sw1 (new-stopwatch)
sw2 (new-stopwatch)]
((:start sw1))
((:start sw2))
(Thread/sleep 100)
((:reset sw1))
((:start sw1))
(println (str "Elapsed for SW1: " ((:elapsed sw1))))
(println (str "Elapsed for SW2: " ((:elapsed sw2))))
(Thread/sleep 100)
(println (str "SW1: " ((:stop sw1))))
(println (str "SW2: " ((:stop sw2)))))
I find for certain things, like a stopwatch, this pattern is actually
pretty nice. I can't think of any alternative way to do this in Clojure
that I'd like better actually.
What are your thoughts?
have you looked at Protocol? that's the way I'd do it.
g
--
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
---
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 [email protected].
For more options, visit https://groups.google.com/d/optout.