On Mon, Sep 1, 2014 at 1:52 AM, <adrian.med...@mail.yu.edu> wrote:

> If you don't want to wrap the object in an atom, you can also reify an
> object that supports IDeref which returns your object. All reified objects
> support IObj out of the box.
>

As I said earlier:

... can't deref it since I can't change the functions that will use it
> later.


And again, later:

I can't really pass a list since the first function is expecting the object
> I am passing,


That was why I was asking how to attach metadata.



>
> On Sunday, August 31, 2014 4:55:58 AM UTC-4, Atamert Ölçgen wrote:
>
>> Hi Francis,
>>
>>
>> On Sat, Aug 30, 2014 at 1:34 PM, Francis Avila <fran...@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 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.
>>>
>>
>>
>>
>> --
>> 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.

Reply via email to