I'm not sure whether this would apply in your case, but have you considered using a WeakHashMap instead of Clojure's metadata?
- James On 31 August 2014 09:55, Atamert Ölçgen <mu...@muhuk.com> wrote: > Hi Francis, > > > On Sat, Aug 30, 2014 at 1:34 PM, Francis Avila <franci...@gmail.com> > wrote: > >> It would probably help if you said more about the source of this >> atom-holding object. Is it a plain Java class? A deftype/defrecord? Is it >> final? >> > > It's not an atom-holding object. The only guarantee is that this object > extends one (or two) of these protocols: > http://clecs.muhuk.com/api/0.2.1/clecs.world.html > > Other than that, it can be anything. A Java class, or a type or a record... > > > >> >> >> If you can control the construction of this object and its class is not >> final, you can subclass it and add an IObj implementation. (Note that most, >> maybe all clojure ways of creating classes create final classes, so this >> technique won't work.) The easiest way to subclass is with `proxy`: >> >> (defn meta-AtomHolder [atom-value metadata] >> (proxy [AtomHolderClass clojure.lang.IObj] ;; [superclass, new >> interfaces] >> [atom-value] ;; constructor args >> (meta [] metadata) ;; subclass method >> (withMeta [newmeta] (meta-AtomHolder newmeta)))) >> => (var user/meta-AtomHolder) >> (meta-AtomHolder (atom "x") {}) >> => #<AtomHolderClass$IObj$40298964 >> user.proxy$AtomHolderClass$IObj$40298964@302c28cc> >> (meta (meta-AtomHolder (atom "x") {})) >> => {} >> (meta (with-meta (meta-AtomHolder (atom "x") {}) {:a 1})) >> => {:a 1} >> > > This is really cool. So I can do (deref (meta-AtomHolder (atom "x") {})) > and it would return "x", right? > > I have actually managed to solve it using vars, had to move things around > a bit: > https://github.com/muhuk/clecs/blob/master/src/clecs/world/check.clj#L73 > > > >> >> If the parent class is final or you can't construct the object yourself, >> you need to delegate method calls from one instance to this object >> instance. I think this is hard-but-not-impossible in java, but I'm not sure. >> >> (Clojurescript has `specify`, which does exactly what you want, but only >> exists because delegation between instances in javascript is trivial.) >> >> On Friday, August 29, 2014 10:16:05 PM UTC-5, Atamert Ölçgen wrote: >>> >>> Obviously I can't. >>> >>> But I need to add this capability to an object. During testing I attach >>> meta to this object that contains an atom. Then I pass this object to other >>> functions, known in runtime. I can't use a dynamic var because all this >>> happens within a mock function that may be retried and run in different >>> threads. >>> >>> I have seen this: http://stackoverflow.com/questions/20724219/ >>> simplest-possible-clojure-object-that-can-accept-a- >>> primitive-and-metadata but can't deref it since I can't change the >>> functions that will use it later. If I wrap this object I need to be able >>> to delegate all of its functionality to the original object. >>> >>> I hope this all is not too vague. The code I'm working on is not online >>> yet. But it's for clecs (https://github.com/muhuk/clecs/), I'm adding >>> quickcheck to compare different world implementations. >>> >>> >>> -- >>> Kind Regards, >>> Atamert Ölçgen >>> >>> -+- >>> --+ >>> +++ >>> >>> www.muhuk.com >>> >> -- >> 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. >> > > > > -- > Kind Regards, > Atamert Ölçgen > > -+- > --+ > +++ > > www.muhuk.com > > -- > 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.