7 ms·
> I honestly can't think of a language that even support overloading of methods based on run time types. Clojure does with multimethods ( http://clojure.org/ru
by ajuc 11y ago
> I honestly can't think of a language that even support overloading of methods based on run time types.
Clojure does with multimethods ( http://clojure.org/runtime_polymorphism http://clojure.org/runtime_polymorphism ). I suspect lisp with meta object protocol does too, but I only heard about it, so can't confirm.
EDIT: deleted my solution that worked without method overloading at all, cause I missed some constraints.
- ajuc 11y agoJust 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.