Thank you much to everyone. In the end, I took James Reeves advice and used a real namespace to qualify the keywords.
On Saturday, August 9, 2014 4:02:59 PM UTC-4, James Reeves wrote: > > Keywords hierarchies need to be namespace qualified, but you can require > namespaces and use the alias, as I demonstrated in my earlier example. > > To give a further example, suppose you have a namespace like: > > (ns example.other) > > (derive ::dog ::animal) > (derive ::cat ::animal) > > (defmulti speak identity) > > If you require this namespace, you can use the alias instead of the fully > qualified name in keywords: > > (ns example.core > (require [example.other :as o])) > > (defmethod o/speak ::o/dog [_] "bark") > (defmethod o/speak ::o/cat [_] "meow") > > - James > > > On 9 August 2014 20:49, larry google groups <lawrenc...@gmail.com > <javascript:>> wrote: > >> Thank you for the responses. However, when I look here: >> >> http://clojure.org/multimethods >> >> I see that it says: >> >> "You can define hierarchical relationships with (derive child parent). >> Child and parent can be either symbols or keywords, and must be >> namespace-qualified" >> >> Is there any way I can establish a hierarchical relationship without it >> being name-spaced qualified? I would like to be able to (slingshot/throw+ >> {:type some-symbol}) and have this be caught in a different namespace, but >> I need a way to match the some-symbol, and I would ideally like it if >> some-symbol >> might be part of a hierarchy, such that I'm matching again some-symbol's >> parent. >> >> Is that possible? >> >> I guess I could hard-code all of the namespaces, such that the symbols >> are all: >> >> some-namespace/some-symbol >> >> but that does great reduce the flexibility of the system. >> >> >> >> >> >> >> On Saturday, August 9, 2014 3:30:33 PM UTC-4, James Reeves wrote: >> >>> Jozef is correct, but to give some examples: >>> >>> (ns example.core >>> (:require [example.other :as other])) >>> >>> (= ::foo :example.core/foo) >>> (= ::other/foo :example.other/foo) >>> >>> (not= :foo :example.core/foo) >>> (not= :example.core/foo :example.other/foo) >>> (not= :other/foo ::other/foo) >>> >>> - James >>> >>> >>> >>> On 9 August 2014 19:14, Jozef Wagner <jozef....@gmail.com> wrote: >>> >>>> Keep in mind that :: is just a syntax sugar that is processed by the >>>> reader, before the compiler kicks in. ::foo is a shorthand for >>>> :your.current.ns/foo. Its purpose is to make it easy to create keywords >>>> that do not clash with other ones. >>>> >>>> Keywords are equal (and identical) only when both of their namespaces >>>> and names are equal. :ns1/foo is thus not equal to :ns2/foo, nor to just >>>> :foo. :: is used in cases where you want to exploit this important >>>> property of keywords, so that your keyword won't e.g. clash with other >>>> keywords in a collection, contents of which you don't know. >>>> >>>> Jozef >>>> >>>> >>>> On Saturday, August 9, 2014 7:46:45 PM UTC+2, larry google groups wrote: >>>>> >>>>> Please forgive this stupid question, but I'm still trying to >>>>> understand exactly what the double "::" means. I have read that I can use >>>>> (derive) to establish a hierarchy and I can imagine how this would be >>>>> useful for things like throwing errors and catching them and logging, but >>>>> I've also read that "::" adds the namespace to the symbol, so I would >>>>> assume that I can not match ::logging from one namespace with ::logging >>>>> from another? >>>>> >>>>> I'm thinking of this especially in my use of Slingshot, where I was >>>>> thinking of doing something like: >>>>> >>>>> (throw+ {:type ::database-problem :message "something wrong in the >>>>> database query"}) >>>>> >>>>> and then at a higher level in my code I was going to catch it with >>>>> something like: >>>>> >>>>> (derive ::database-problem ::logging) >>>>> >>>>> and then using Dire: >>>>> >>>>> (dire/with-handler! #'database/remove-this-item >>>>> [:type ::logging] >>>>> (fn [e & args] >>>>> (timbre/log (str " database/remove-this-item: The time : " >>>>> (dates/current-time-as-string) ( str e)))) >>>>> >>>>> but conceptually I am having trouble understanding how ::logging in >>>>> one namespace can match ::logging in another namespace. Perhaps I should >>>>> just use normal keywords? >>>>> >>>>> >>>>> -- >>>> You received this message because you are subscribed to the Google >>>> Groups "Clojure" group. >>>> To post to this group, send email to clo...@googlegroups.com >>>> >>>> Note that posts from new members are moderated - please be patient with >>>> your first post. >>>> To unsubscribe from this group, send email to >>>> clojure+u...@googlegroups.com >>>> >>>> For more options, visit this group at >>>> http://groups.google.com/group/clojure?hl=en >>>> --- >>>> You received this message because you are subscribed to the Google >>>> Groups "Clojure" group. >>>> To unsubscribe from this group and stop receiving emails from it, send >>>> an email to clojure+u...@googlegroups.com. >>>> >>>> For more options, visit https://groups.google.com/d/optout. >>>> >>> >>> > -- 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 Note that posts from new members are moderated - please be patient with your first post. To unsubscribe from this group, send email to clojure+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/clojure?hl=en --- You received this message because you are subscribed to the Google Groups "Clojure" group. To unsubscribe from this group and stop receiving emails from it, send an email to clojure+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.