Hi all, I am working on the multimethod chapter this week. This has required a lot of exploration, as the multimethod feature set goes well beyond what most people are using yet. I have hit one rough spot: derive. I have working code (below), but I don't like the way I have to call it with fully qualified keywords, e.g.
(service-charge {:tag :examples.multimethods.service-charge-3/ checking :balance 100}) -> 25 (service-charge {:tag :examples.multimethods.service-charge-3/ checking :balance 10000}) -> 0 I feel that I have made a wrong turn somewhere. Here are my assumptions: 1. I (the implementer) have to write my dispatch functions with qualified names, if I want to use derive. 2. John Doe (the caller) must use fully qualified names *everywhere*. Since he does not live in my namespace he cannot use the ::. It's the latter that bothers me. It seems so ugly that I would never use hierarchical names for anything, which makes me think I am missing something. To make matters worse: 3. Once I use :: once on any keyword in my implementation, it is a quick slope to using it other places too, just so I don't have to remember which ones I chose to qualify and which ones I didn't. In the code below, :premium and :basic become ::premium and ::basic just for consistency with ::checking and ::savings. Is anybody else working with derive? What are your experiences? Thanks, Stu --------------------------------------------------------------------------- (ns examples.multimethods.service-charge-3) (defmulti account-level :tag) (println ::checking) (defmethod account-level ::checking [acct] (if (>= (:balance acct) 5000) ::premium ::basic)) (defmethod account-level ::savings [acct] (if (>= (:balance acct) 1000) ::premium ::basic)) (derive ::savings ::account) (derive ::checking ::account) (defmulti service-charge (fn [acct] [(account-level acct) (:tag acct)])) (defmethod service-charge [::basic ::checking] [_] 25) (defmethod service-charge [::basic ::savings] [_] 10) (defmethod service-charge [::premium ::account] [_] 0) --~--~---------~--~----~------------~-------~--~----~ 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 -~----------~----~----~----~------~----~------~--~---