Hey Alex,
Not sure I follow. If we deref (volatile! 5), the dereffed val is a number.
`(inc @(volatile! 5))` will involve boxed math but `(inc ^long @(volatile!
5))` won't.
So, for example:
(defn core-take ; As in clojure.core
([n]
(fn [rf]
(let [nv (volatile! n)]
(fn
([] (rf))
([result] (rf result))
([result input]
(let [n @nv
nn (vswap! nv dec)
result (if (pos? n)
(rf result input)
result)]
(if (not (pos? nn))
(ensure-reduced result)
result))))))))
(defn new-take ; Without boxed math
([^long n]
(fn [rf]
(let [nv (volatile! n)]
(fn
([] (rf))
([result] (rf result))
([result input]
(let [^long n @nv
^long nn (vswap! nv #(dec ^long %))
result (if (pos? n)
(rf result input)
result)]
(if (not (pos? nn))
(ensure-reduced result)
result))))))))
Timing on the latter is little better. Does that make sense, or am I
missing something?
--
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.