Hi Patrick,

How about:

(defmulti length (fn [x]
                  (if (= :stateMachine  (:class x))
                    (:state x)
                    (:class x))))

(defmethod length :yardstick [x] 36)
(defmethod length :walking [x] "short")
(defmethod length :running [x] "long")

user=> (length {:class :yardstick})
36
user=> (length {:class :stateMachine :state :walking})
"short"
user=> (length {:class :stateMachine :state :running})
"long"

It would probably be better to have the fn return a vector so you  
don't have to worry about :state and :class values with colliding  
names, but that's the basic idea.

Cheers,
Stuart

> Is there anyway to do the following with the existing multi-method
> facilities?
>
> There is a general multi-method length(object) that splits off to
> different methods depending on the :class of the object.
>
> And then specifically for objects with :class = :stateMachine, I want
> to define it's method to split off further depending on the :state of
> the object.
>
> (defmulti length :class)
> (defmethod-multi length :stateMachine :state)
>
> (defmethod length :stateMachine :walking
>  (println "Short distance"))
>
> (defmethod length :stateMachine :running
>  (println "Long distance"))
>
> Thanks very much for your help.
>  -Patrick
> >


--~--~---------~--~----~------------~-------~--~----~
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
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at 
http://groups.google.com/group/clojure?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to