Hi,

On Dec 7, 10:21 am, Tzach <tzach.livya...@gmail.com> wrote:

> (defmulti collide-with foo)
>
> (defmethod collide-with ["asteroid" "spaceship"] (print "Boom"))
> (defmethod collide-with ["asteroid" any] (print " Wiiissh"))
> (defmethod collide-with [any "spaceship"] (print "Wooossh"))
> (defmethod collide-with [any any] (print "Dead Space"))
>
> The idea is to have a default function for a collision of asteroid
> with anything else, and of spaceship with anything else.
> What foo can I use?

Eg. a custom hierarchy. Since there is no bottom type, you have to
create it manually. Deriving Object from ::Any takes care of the Java
land. For clojure land you have to derive each type from ::Any (or
anything already deriving from ::Any).

(def space-hierarchy
  (-> (make-hierarchy)
    (derive Object ::Any)
    (derive ::Spaceship ::Any)
    (derive ::Asteroid ::Any)))

(defmulti collide-with
  #(vec (map type %&))
  :hierarchy #'space-hierarchy)

(defmethod collide-with :default
  [_ _]
  (print "Dead Space"))

(defmethod collide-with [::Asteroid ::Any]
  [_ _]
  (print "Wiiissh"))

(defmethod collide-with [::Any ::Spaceship]
  [_ _]
  (print "Wooosssh"))

(defmethod collide-with [::Asteroid ::Spaceship]
  [_ _]
  (println "Booom!"))

Maybe you have to disambiguate with prefer-method in certain cases. (I
don't think, that's the case here, but I haven't tested it...)

Hope this helps.

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

Reply via email to