Hi Marcus,

That's an interesting approach. My first reaction was that the update is
still not atomic, since you have:

(when-not (contains? @cache k)
  (swap! cache assoc k (calc-value* k)))

Which I thought could cause different clients to see different values
depending on the race condition there. But since in theory calc-value*
should always return the same value for the same key, at worst you'll just
end up swapping the same value in unnecessarily. I'd need to think a bit
about the implications of using a memoised function in an atom update to
convince myself, but it's a neat idea - thanks!

Cheers,
Colin



On 31 August 2014 04:25, Marcus Magnusson <marx...@gmail.com> wrote:

> 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> wrote:
>>
>>>  On 30 August 2014 06:26, Colin Fleming <colin.ma...@gmail.com> 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
>>>
>>> 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
>>>
>>> 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.
>>>
>>> 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.
>

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