4 ms·
Just an example: (derive ::wizard ::person) (derive ::warior ::person) (derive ::weapon ::thing) (derive ::dagger ::weapon) (derive ::swor
by ajuc 11y ago
Just an example:
(derive ::wizard ::person)
(derive ::warior ::person)
(derive ::weapon ::thing)
(derive ::dagger ::weapon)
(derive ::sword ::weapon)
(derive ::staff ::weapon)
;; defines dispatch function that returns (inheritable) categories to dispath
;; it's very simple in this case
(defmulti wield! (fn [p1 p2 thing]
[(type p2) (type thing)]))
(defmethod wield! [::person ::thing] [p1 p2 thing]
(say! p1 p2 " refuse"))
(defmethod wield! [::person ::dagger] [p1 p2 thing]
(take! p2 p1 thing)
(say! p1 p2 "accepts."))
(defmethod wield! [::wizard ::staff] [p1 p2 thing]
(take! p2 p1 thing)
(say! p1 p2 " gladly accepts."))
(defmethod wield! [::warrior ::sword] [p1 p2 thing]
(take! p2 p1 thing)
(say! p1 p2 " gladly accepts."))
It obviously could be done in half the lines without using multimethods, but the result would be much less extensible.
BTW, with just 2 lines you can add gandalf and it just works (because there are no conflicting methods right now).
(derive ::gandalf ::wizard)
(derive ::gandalf ::warrior)
If there were any - you can set preferences to avoid errors.