On Mon, Aug 25, 2008 at 11:57 AM, Rich Hickey <[EMAIL PROTECTED]> wrote:

>
> (def hits (ref 0))
> (def cache (ref {:n nil :factors nil}))
> (def cache-hits (ref 0))
>
> (defn cached-factor [n]
>   (dosync (commute hits inc))
>  (let [cached @cache]
>    (if (= n (cached :n))
>      (dosync (commute cache-hits inc)
>        (cached :factors))
>       (let [factors (factor n)]
>        (dosync
>          (commute cache (fn [_] {:n n :factors factors})))
>        factors))))
>
> The ref-sets were needed in your example, but with a composite cache,
> you can use the commute trick above (commute with a fn that ignores
> its arg) to get last-one-in-wins, since this is just a last-value-only
> cache.
>

Is there a stylistic or correctness advantage to using commute over ref-set
on the composite cache? As in:
(dosync (ref-set cache {:n n :factors factors}))

--Shawn

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

Reply via email to