How about something like this? You can still keep your cache as an atom 
that you can pass around, and you avoid unnecessary recomputation through 
memoize:

(def cache (atom {}))

(def lookup
  (let [calc-value* (memoize calc-value)]
    (fn [cache k]
      (when-not (contains? @cache k)
        (swap! cache assoc k (calc-value* k)))
      (@cache k))))

Den lördagen den 30:e augusti 2014 kl. 12:11:58 UTC+2 skrev Colin Fleming:
>
> In my case I can't use memoize because I need to supply the cache map - 
> that in turn is stored on another object so it can be invalidated by events 
> outside my control.
>
>
> On 30 August 2014 20:00, Ray Miller <r...@1729.org.uk <javascript:>> 
> wrote:
>
>> On 30 August 2014 06:26, Colin Fleming <colin.ma...@gmail.com 
>> <javascript:>> wrote:
>> >
>> > I want to use a map to cache values based on a key. I'm planning to use 
>> an
>> > atom for this. My basic operation is "give me the value for this key" - 
>> if
>> > the value exists in the map then that value should be returned, 
>> otherwise a
>> > new value should be calculated, inserted in the map and then returned. 
>> My
>> > plan is to implement something like the following:
>> >
>> >
>> > (defn ensure [cache key]
>> >   (if (contains? cache key)
>> >     cache
>> >     (assoc cache key (calc-value key))))
>> >
>> > (let [value (get (swap! cache ensure key) key)]
>> >   ... do my thing with value ...)
>>
>> Why not just use memoize?
>>
>> (def calc-value (memoize (fn [key] ...))
>>
>> If you need more control over the cache, check out core.memoize (which
>> builds on top of core.cache).
>>
>> Ray.
>>
>> --
>> You received this message because you are subscribed to the Google
>> Groups "Clojure" group.
>> To post to this group, send email to clo...@googlegroups.com 
>> <javascript:>
>> Note that posts from new members are moderated - please be patient with 
>> your first post.
>> To unsubscribe from this group, send email to
>> clojure+u...@googlegroups.com <javascript:>
>> 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+u...@googlegroups.com <javascript:>.
>> For more options, visit https://groups.google.com/d/optout.
>>
>
>

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