i am not trying anything, i just want to figure out what happens. this is
my output for the "print" version:
user=> (defmulti fac print)
(defmethod fac 1 [_] 1)
(defmethod fac :default [n] (*' n (fac (dec n))))
#'user/fac
#<MultiFn clojure.lang.MultiFn@1afb02d>
#<MultiFn clojure.lang.MultiFn@1afb02d>
user=> (fac 1)
10-1-2-3-4-5-6-7-8-9-10-11-12-13-14-15-16-17-18-19-20-21-22-23-24-25-26-27-28-....until
stackoverflow


2013/6/22 Chris Bilson <cbil...@pobox.com>

> Dennis Haupt <d.haup...@gmail.com> writes:
>
> > i was taking a look at multimethods:
> > (defmulti fac int)
> > (defmethod fac 1 [_] 1)
> > (defmethod fac :default [n] (*' n (fac (dec n))))
> >
> > this works
> >
> > however, this also works:
> >
> > (defmulti fac print)
> > (defmethod fac 1 [_] 1)
> > (defmethod fac :default [n] (*' n (fac (dec n))))
>
> This definately does not work when I try it:
>
>      user> (defmulti fac print)
>      #<Var@6427854d: #<MultiFn clojure.lang.MultiFn@4bddef9a>>
>      nil
>      user> (defmethod fac 1 [_] 1)
>      #<MultiFn clojure.lang.MultiFn@4bddef9a>
>      nil
>      user> (fac 1)
>      IllegalArgumentException No method in multimethod 'fac' for dispatch
> value: null  clojure.lang.MultiFn.getFn (MultiFn.java:160)
>      1
>
> The second arg to defmulti's job is to decide which method to call. The
> print function always produces nil, so you would need a defmethod for
> dispatch value nil to use print as a dispatch function:
>
>     user> (defmethod fac nil [_] 2)
>     #<MultiFn clojure.lang.MultiFn@4bddef9a>
>     nil
>     user> (fac 1)
>     12
>     nil
>
> Notice the "12": the "1" is from print and the "2" is the value the
> method produced.
>
> Are you trying to print the dispatch values so you can see them for
> tracing or something? If so, you could try something like:
>
>     user> (defn inspect [& stuff]
>             (println "inspect: " stuff)
>             (first stuff))
>     #<Var@5b1413a8:
>       #<user$eval336$inspect__337 user$eval336$inspect__337@68903261>>
>     nil
>     user> (inspect 1)
>     inspect:  (1)
>     1
>     nil
>     user> (defmulti fac2 inspect)
>     nil
>     nil
>     user> (defmethod fac2 1 [_] 1)
>     #<MultiFn clojure.lang.MultiFn@e2df60d>
>     nil
>     user> (fac2 1)
>     inspect:  (1)
>     1
>     nil
>     user>
>
>
> --
> --
> 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.


Reply via email to