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 [email protected]
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
-~----------~----~----~----~------~----~------~--~---