Have you looked at core.memoize, which uses core.cache under the hood? It
allows for pluggable caching strategies that might suit your use-case.

https://github.com/clojure/core.memoize


On Sat, May 3, 2014 at 10:27 PM, Mike Fikes <mikefi...@me.com> wrote:

> Are there common techniques or idioms for achieving structural sharing
> when composing data where equivalences exist?
>
> (My motivation is to reduce heap usage for a particular problem I'm
> working on that involves a lot of repeated data.)
>
> As a specific example, consider sharing equivalent map values:
>
> (def m1 {:a [1 2]})
>
> (def m2 (assoc m1 :b [1 2]))
>
>
> (identical? (m2 :a) (m2 :b))
>
> ;; => false
>
>
> For this simple example, I can force sharing by introducing a variant of
> assoc which looks at existing values:
>
>
> (defn assoc-id [map key val] (assoc map key (get (apply hash-set (vals
> map)) val val)))
>
>
> And using it results in a map with two identical values:
>
>
> (def m3 (assoc-id m1 :b [1 2]))
>
>
> (identical? (m3 :a) (m3 :b))
>
> ;; => true
>
>
> But, of course, this approach could get to be expensive and/or unwieldy if
> not done carefully.
>
>
> So, I was wondering if there are general techniques in this area. I'm sure
> I'm not the first to come across it. We already get this automatically
> for boxing of small integers:
>
>
> (identical? 5 5)
>
> ;; => true
>
>
> (identical? 500 500)
>
> ;; => false
>
>
> So I suppose I'm essentially looking for the same idea but for larger
> non-primitive "values".
>
>
>  --
> 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