Here's an example of using multimethods. (Note: I overrode the Clojure defmulti/defmethod macros with my own that play more nicely with the repl, and for other purposes. It's a straightforward translation.) You can see all the code here:
https://github.com/marick/fp-oo/blob/master/sources/asteroids.clj The code's explained in chapter 14 of https://leanpub.com/fp-oo ;;; Objects of interest (def make (fn [type value-map] (with-meta value-map {:type type}))) (def rim-griffon (make ::starship {:name "Rim Griffon", :speed 1000})) (def malse (make ::asteroid {:name "Malse", :speed 0.1, :gravitational-pull 0.5})) ;;; Collide with multi-arg dispatch (defgeneric collide (fn [one two] [(type one) (type two)])) (defspecialized collide [::asteroid ::asteroid] (fn [& asteroids] asteroids)) (defspecialized collide [::asteroid ::starship] (fn [asteroid starship] [asteroid (stopped starship)])) (defspecialized collide [::starship ::asteroid] (fn [starship asteroid] [(stopped starship) asteroid])) (defspecialized collide [::starship ::starship] (fn [& starships] (let [speed (apply max (map :speed starships))] (map (partial with-speed speed) starships)))) ----- Brian Marick, Artisanal Labrador Contract programming in Ruby and Clojure Occasional consulting on Agile Writing /Functional Programming for the Object-Oriented Programmer/: https://leanpub.com/fp-oo -- 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