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 <lawrencecloj...@gmail.com>
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.

Reply via email to