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

Reply via email to