How to add extend print-method without screwing up ?

2010-01-05 Thread Gabi
Hi
I am trying to extend Clojures' print-method using defmethod for a
library I develop.:
How can I do this without affecting users of my lib (i want only my
lib to be affected )?

(derive clojure.lang.Fn ::fn)
(prefer-method print-method ::fn  java.lang.Object)

(defmethod print-method ::fn
[o w]
   (.write w "Some Fn")

This is quite nice, but I would like to use a private hierarchy for
the above, but cant. (print-method is defined on global hierarchy)
What should I do ?

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


Re: How to add extend print-method without screwing up ?

2010-01-05 Thread Laurent PETIT
How about creating your own print-method multimethod in a lib of your
own, and in your libs, excluding clojure.core/print-method and
importing your-lib/print-method instead.

Then, in your-lib, make the default print-method invocation just call
clojure.core/print-method, create your own private hierarchy, and
provide defmethods for those types you want to provide with your own
implementation of defmethod ...

Cant' think of something better, for now ...

HTH,

-- 
Laurent

2010/1/5 Gabi :
> Hi
> I am trying to extend Clojures' print-method using defmethod for a
> library I develop.:
> How can I do this without affecting users of my lib (i want only my
> lib to be affected )?
>
> (derive clojure.lang.Fn ::fn)
> (prefer-method print-method ::fn  java.lang.Object)
>
> (defmethod print-method ::fn
>    [o w]
>   (.write w "Some Fn")
>
> This is quite nice, but I would like to use a private hierarchy for
> the above, but cant. (print-method is defined on global hierarchy)
> What should I do ?
>
> --
> 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 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

Re: How to add extend print-method without screwing up ?

2010-01-05 Thread Gabi
Hmm.. I hoped I could avoid this.  Multi-methods should be extended,
not copied and then extended :)
But if there is no other way, I probably settle for this cumbersome
solution..


On Jan 5, 11:21 pm, Laurent PETIT  wrote:
> How about creating your own print-method multimethod in a lib of your
> own, and in your libs, excluding clojure.core/print-method and
> importing your-lib/print-method instead.
>
> Then, in your-lib, make the default print-method invocation just call
> clojure.core/print-method, create your own private hierarchy, and
> provide defmethods for those types you want to provide with your own
> implementation of defmethod ...
>
> Cant' think of something better, for now ...
>
> HTH,
>
> --
> Laurent
>
> 2010/1/5 Gabi :
>
> > Hi
> > I am trying to extend Clojures' print-method using defmethod for a
> > library I develop.:
> > How can I do this without affecting users of my lib (i want only my
> > lib to be affected )?
>
> > (derive clojure.lang.Fn ::fn)
> > (prefer-method print-method ::fn  java.lang.Object)
>
> > (defmethod print-method ::fn
> >    [o w]
> >   (.write w "Some Fn")
>
> > This is quite nice, but I would like to use a private hierarchy for
> > the above, but cant. (print-method is defined on global hierarchy)
> > What should I do ?
>
> > --
> > 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 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

Re: How to add extend print-method without screwing up ?

2010-01-05 Thread Laurent PETIT
Multi-methods can be extended ... to the extent of what their
dispatch-function defines.

So for what you want to work, you should have this notion of "from
where is the multi-method called" wired in the dispatch function.
Imagineyou could redefine the dispatch function (which you can not for
print-method, or this would be very hackish I guess). Even there,
you'll have to solve the "how does the dispatch method know from which
namespace the multimethod is called ?" ...). Generally, dispatch
methods will work on the arguments of the multi-method. Surely, they
could also work by doing introspection of the call stack by hooking
into clojure internals, and also you could make them work differently
by having them inspect global variables ... huck !!!

What you want isn't even easily solved by OOP like in javascript,
where you can change every method implementation of every object,
because you would like the method implementation to be chosen
depending on the caller of the method, not just the callee or a
function of the other arguments of the method ...

HTH,

-- 
Laurent

2010/1/5 Gabi :
> Hmm.. I hoped I could avoid this.  Multi-methods should be extended,
> not copied and then extended :)
> But if there is no other way, I probably settle for this cumbersome
> solution..
>
>
> On Jan 5, 11:21 pm, Laurent PETIT  wrote:
>> How about creating your own print-method multimethod in a lib of your
>> own, and in your libs, excluding clojure.core/print-method and
>> importing your-lib/print-method instead.
>>
>> Then, in your-lib, make the default print-method invocation just call
>> clojure.core/print-method, create your own private hierarchy, and
>> provide defmethods for those types you want to provide with your own
>> implementation of defmethod ...
>>
>> Cant' think of something better, for now ...
>>
>> HTH,
>>
>> --
>> Laurent
>>
>> 2010/1/5 Gabi :
>>
>> > Hi
>> > I am trying to extend Clojures' print-method using defmethod for a
>> > library I develop.:
>> > How can I do this without affecting users of my lib (i want only my
>> > lib to be affected )?
>>
>> > (derive clojure.lang.Fn ::fn)
>> > (prefer-method print-method ::fn  java.lang.Object)
>>
>> > (defmethod print-method ::fn
>> >    [o w]
>> >   (.write w "Some Fn")
>>
>> > This is quite nice, but I would like to use a private hierarchy for
>> > the above, but cant. (print-method is defined on global hierarchy)
>> > What should I do ?
>>
>> > --
>> > 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 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 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

Re: How to add extend print-method without screwing up ?

2010-01-05 Thread Gabi
Yes. I guess you have a point. Maybe I just wanted too much out of it.
This think could be solved easily if defmethod supported hierarchy as
arg (or in meta).
But on the other hand, such feature would make it very easy to make a
total mess..



On Jan 5, 11:59 pm, Laurent PETIT  wrote:
> Multi-methods can be extended ... to the extent of what their
> dispatch-function defines.
>
> So for what you want to work, you should have this notion of "from
> where is the multi-method called" wired in the dispatch function.
> Imagineyou could redefine the dispatch function (which you can not for
> print-method, or this would be very hackish I guess). Even there,
> you'll have to solve the "how does the dispatch method know from which
> namespace the multimethod is called ?" ...). Generally, dispatch
> methods will work on the arguments of the multi-method. Surely, they
> could also work by doing introspection of the call stack by hooking
> into clojure internals, and also you could make them work differently
> by having them inspect global variables ... huck !!!
>
> What you want isn't even easily solved by OOP like in javascript,
> where you can change every method implementation of every object,
> because you would like the method implementation to be chosen
> depending on the caller of the method, not just the callee or a
> function of the other arguments of the method ...
>
> HTH,
>
> --
> Laurent
>
> 2010/1/5 Gabi :
>
> > Hmm.. I hoped I could avoid this.  Multi-methods should be extended,
> > not copied and then extended :)
> > But if there is no other way, I probably settle for this cumbersome
> > solution..
>
> > On Jan 5, 11:21 pm, Laurent PETIT  wrote:
> >> How about creating your own print-method multimethod in a lib of your
> >> own, and in your libs, excluding clojure.core/print-method and
> >> importing your-lib/print-method instead.
>
> >> Then, in your-lib, make the default print-method invocation just call
> >> clojure.core/print-method, create your own private hierarchy, and
> >> provide defmethods for those types you want to provide with your own
> >> implementation of defmethod ...
>
> >> Cant' think of something better, for now ...
>
> >> HTH,
>
> >> --
> >> Laurent
>
> >> 2010/1/5 Gabi :
>
> >> > Hi
> >> > I am trying to extend Clojures' print-method using defmethod for a
> >> > library I develop.:
> >> > How can I do this without affecting users of my lib (i want only my
> >> > lib to be affected )?
>
> >> > (derive clojure.lang.Fn ::fn)
> >> > (prefer-method print-method ::fn  java.lang.Object)
>
> >> > (defmethod print-method ::fn
> >> >    [o w]
> >> >   (.write w "Some Fn")
>
> >> > This is quite nice, but I would like to use a private hierarchy for
> >> > the above, but cant. (print-method is defined on global hierarchy)
> >> > What should I do ?
>
> >> > --
> >> > 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 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 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

Re: How to add extend print-method without screwing up ?

2010-01-06 Thread Meikel Brandmeyer
Hi,

On Jan 5, 11:14 pm, Gabi  wrote:

> This think could be solved easily if defmethod supported hierarchy as
> arg (or in meta).

This doesn't even solve your problem, since the hierarchy is used to
find out *which* method should be called. So hooking a hierarchy on a
method doesn't really help.

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