Re: Invoke a specific multimethod

2013-03-31 Thread Chas Emerick
Just copy/paste from my Counterclockwise REPL. :-)

- Chas

On Mar 30, 2013, at 11:54 PM, JvJ wrote:

 Also, nice syntax highlighting!  How'd you do that?
 
 On Saturday, 30 March 2013 23:54:03 UTC-4, JvJ wrote:
 get-method.  Thanks, that was exactly what I was looking for!
 
 On Saturday, 30 March 2013 07:20:54 UTC-4, Chas Emerick wrote:
 On Mar 30, 2013, at 12:00 AM, George Oliver wrote:
 
 
 
 On Friday, March 29, 2013 6:19:19 PM UTC-7, JvJ wrote:
 Is it possible to invoke a particular multimethod and bypass the dispatch 
 function?
 
 For instance, suppose that I have a multimethod with a dispatch value of 
 ::foo, and it's a really complex method.
 
 Now, I want all cases where the dispatch function returns nil to use the 
 same multimethod.  Is there a way I can intercept the nil and
 pass it directly on to the ::foo multimethod?
 
 You could use the default multimethod to catch nil, and then call the multi 
 with ::foo. 
 
 That will only work if the dispatch fn is identity or similar.
 
 If you control the dispatch fn, then you don't need to intercept nil -- 
 just returning ::foo from the dispatch fn when it might otherwise return nil 
 will get you to the method you want.
 
 If you *don't* control the dispatch fn, but you're providing the methods for 
 :foo and nil, then you can use `get-method` to obtain the method associated 
 with a particular dispatch value:
 
 = (defmulti foo :bar)
 #'user/foo
 = (defmethod foo :baz
  [x]
  (str x))
 #MultiFn clojure.lang.MultiFn@6194a872
 = (defmethod foo :default
  [x]
  ((get-method foo :baz) x))
 #MultiFn clojure.lang.MultiFn@6194a872
 = (foo {:bar :baz})
 {:bar :baz}
 = (foo {:some :other :value :here})
 {:some :other, :value :here}
 
 Of course, if the functionality you need is available as a separate top-level 
 fn, and you can avoid the extra effective dispatch through the multimethod, 
 all the better.
 
 Cheers,
 
 - Chas
 
 
 -- 
 -- 
 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/groups/opt_out.
  
  

-- 
-- 
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/groups/opt_out.




Re: Invoke a specific multimethod

2013-03-30 Thread Chas Emerick
On Mar 30, 2013, at 12:00 AM, George Oliver wrote:

 
 
 On Friday, March 29, 2013 6:19:19 PM UTC-7, JvJ wrote:
 Is it possible to invoke a particular multimethod and bypass the dispatch 
 function?
 
 For instance, suppose that I have a multimethod with a dispatch value of 
 ::foo, and it's a really complex method.
 
 Now, I want all cases where the dispatch function returns nil to use the same 
 multimethod.  Is there a way I can intercept the nil and
 pass it directly on to the ::foo multimethod?
 
 You could use the default multimethod to catch nil, and then call the multi 
 with ::foo. 

That will only work if the dispatch fn is identity or similar.

If you control the dispatch fn, then you don't need to intercept nil -- just 
returning ::foo from the dispatch fn when it might otherwise return nil will 
get you to the method you want.

If you *don't* control the dispatch fn, but you're providing the methods for 
:foo and nil, then you can use `get-method` to obtain the method associated 
with a particular dispatch value:

= (defmulti foo :bar)
#'user/foo
= (defmethod foo :baz
 [x]
 (str x))
#MultiFn clojure.lang.MultiFn@6194a872
= (defmethod foo :default
 [x]
 ((get-method foo :baz) x))
#MultiFn clojure.lang.MultiFn@6194a872
= (foo {:bar :baz})
{:bar :baz}
= (foo {:some :other :value :here})
{:some :other, :value :here}

Of course, if the functionality you need is available as a separate top-level 
fn, and you can avoid the extra effective dispatch through the multimethod, all 
the better.

Cheers,

- Chas

-- 
-- 
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/groups/opt_out.




Re: Invoke a specific multimethod

2013-03-30 Thread JvJ
get-method.  Thanks, that was exactly what I was looking for!

On Saturday, 30 March 2013 07:20:54 UTC-4, Chas Emerick wrote:

 On Mar 30, 2013, at 12:00 AM, George Oliver wrote:



 On Friday, March 29, 2013 6:19:19 PM UTC-7, JvJ wrote:

 Is it possible to invoke a particular multimethod and bypass the dispatch 
 function?

 For instance, suppose that I have a multimethod with a dispatch value of 
 ::foo, and it's a really complex method.

 Now, I want all cases where the dispatch function returns nil to use the 
 same multimethod.  Is there a way I can intercept the nil and
 pass it directly on to the ::foo multimethod?


 You could use the default multimethod to catch nil, and then call the 
 multi with ::foo. 


 That will only work if the dispatch fn is identity or similar.

 If you control the dispatch fn, then you don't need to intercept nil -- 
 just returning ::foo from the dispatch fn when it might otherwise return 
 nil will get you to the method you want.

 If you *don't* control the dispatch fn, but you're providing the methods 
 for :foo and nil, then you can use `get-method` to obtain the method 
 associated with a particular dispatch value:

 = (*defmulti* foo :bar)
 #'user/foo
 = (*defmethod* foo :baz
  [x]
  (str x))
 #MultiFn clojure.lang.MultiFn@6194a872
 = (*defmethod* foo :default
  [x]
  ((get-method foo :baz) x))
 #MultiFn clojure.lang.MultiFn@6194a872
 = (foo {:bar :baz})
 {:bar :baz}
 = (foo {:some :other :value :here})
 {:some :other, :value :here}

 Of course, if the functionality you need is available as a separate 
 top-level fn, and you can avoid the extra effective dispatch through the 
 multimethod, all the better.

 Cheers,

 - Chas



-- 
-- 
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/groups/opt_out.




Re: Invoke a specific multimethod

2013-03-30 Thread JvJ
Also, nice syntax highlighting!  How'd you do that?

On Saturday, 30 March 2013 23:54:03 UTC-4, JvJ wrote:

 get-method.  Thanks, that was exactly what I was looking for!

 On Saturday, 30 March 2013 07:20:54 UTC-4, Chas Emerick wrote:

 On Mar 30, 2013, at 12:00 AM, George Oliver wrote:



 On Friday, March 29, 2013 6:19:19 PM UTC-7, JvJ wrote:

 Is it possible to invoke a particular multimethod and bypass the 
 dispatch function?

 For instance, suppose that I have a multimethod with a dispatch value of 
 ::foo, and it's a really complex method.

 Now, I want all cases where the dispatch function returns nil to use the 
 same multimethod.  Is there a way I can intercept the nil and
 pass it directly on to the ::foo multimethod?


 You could use the default multimethod to catch nil, and then call the 
 multi with ::foo. 


 That will only work if the dispatch fn is identity or similar.

 If you control the dispatch fn, then you don't need to intercept nil -- 
 just returning ::foo from the dispatch fn when it might otherwise return 
 nil will get you to the method you want.

 If you *don't* control the dispatch fn, but you're providing the methods 
 for :foo and nil, then you can use `get-method` to obtain the method 
 associated with a particular dispatch value:

 = (*defmulti* foo :bar)
 #'user/foo
 = (*defmethod* foo :baz
  [x]
  (str x))
 #MultiFn clojure.lang.MultiFn@6194a872
 = (*defmethod* foo :default
  [x]
  ((get-method foo :baz) x))
 #MultiFn clojure.lang.MultiFn@6194a872
 = (foo {:bar :baz})
 {:bar :baz}
 = (foo {:some :other :value :here})
 {:some :other, :value :here}

 Of course, if the functionality you need is available as a separate 
 top-level fn, and you can avoid the extra effective dispatch through the 
 multimethod, all the better.

 Cheers,

 - Chas



-- 
-- 
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/groups/opt_out.




Invoke a specific multimethod

2013-03-29 Thread JvJ
Is it possible to invoke a particular multimethod and bypass the dispatch 
function?

For instance, suppose that I have a multimethod with a dispatch value of 
::foo, and it's a really complex method.

Now, I want all cases where the dispatch function returns nil to use the 
same multimethod.  Is there a way I can intercept the nil and
pass it directly on to the ::foo multimethod?

-- 
-- 
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/groups/opt_out.




Re: Invoke a specific multimethod

2013-03-29 Thread George Oliver


On Friday, March 29, 2013 6:19:19 PM UTC-7, JvJ wrote:

 Is it possible to invoke a particular multimethod and bypass the dispatch 
 function?

 For instance, suppose that I have a multimethod with a dispatch value of 
 ::foo, and it's a really complex method.

 Now, I want all cases where the dispatch function returns nil to use the 
 same multimethod.  Is there a way I can intercept the nil and
 pass it directly on to the ::foo multimethod?


You could use the default multimethod to catch nil, and then call the multi 
with ::foo. 

-- 
-- 
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/groups/opt_out.