I'm not certain I know what use case you're getting at. It sounds like you 
want to take the current state of the global hierarchy and "fork" it into a 
private hierarchy? Even though the var is private you can still access its 
value:

@#'clojure.core/global-hierarchy (same as (deref (var 
clojure.core/global-hierarchy)))

I think you are already aware you can make and use your own hierarchies: 
all multimethod-related functions have an optional argument to accept a 
hierarchy directly as a value (or in a mutable ref container such as a var 
or atom in defmulti's case).

So to "fork" your own hierarchy, grab a snapshot the global-hierarchy var's 
value and use the derive and underive on that value to make your own 
hierarchy. Note that the heirarchy-explicit arities of derive and underive 
are pure: they return the new hierarchy map and do not mutate anything. 
(You also don't have to use namespace keywords for the type names.)

I hope you are not talking about something like a "live fork", where you 
want your own hierarchy expressed as a diff against the global-hierarchy 
and updated when the global hierarchy's value changes? You can probably do 
that with enough ILookup magic or a var watcher to recompute the derived 
hierarchy, but that sounds like a bad idea in general. Hierarchies are only 
useful with the named multimethods that explicitly use them, so it's hard 
to imagine a case where you want a multimethod to be "global hierarchy plus 
changes" and not just an entirely separate hierarchy.

On Sunday, April 8, 2018 at 1:57:41 PM UTC-5, Pedro Iago Carvalho Martins 
wrote:

> Ok, this is part of a theme that haunts me and I would like to know if 
> anyone shares my view or has a insteresting point.
>
> The #'global-hierarchy in clojure.core is used to enable things such as 
> multi-methods, and the isa? function.
> Now, we can change a var with alter-var-root, and I see it mostly being 
> used for configuration, as with *unchecked-math* or *warn-on-reflection*.
> But for some reason the global-hierachy is private, and in a weird way 
> where you can change it, as long you play the game.
>
> Example:
> (def a {:type ::a :val 1})
>
> (defn cons-a-foo [bar in]
>   (if (isa? (:type in) ::foo)
>     (cons (:val in) bar)
>     bar))
>
> (cons-a-foo [] a)    ; => []
> (derive ::a ::foo)   ; we change the global-hierarchy
> (cons-a-foo [] a)    ; => [1]
> (underive ::a ::foo) ; yet again
> (cons-a-foo [] a)    ; => []
>
> ;And then isa? also supports a 3-ary version, which takes a hierarchy as:
>
> (make-hierarchy) ; => {:parents {} :descendants {} :ancestors {}} ;omg it 
> is just a map! glad I know those
>
> This is all good, except for one reason: global-hierarchy is private.
> We can't for instance try a "alternate-hierarchy" that is mostly the 
> global one with some expeculations.
> We lose all the other map functions in dealing with, especifically, the 
> global-hierarchy.
> And then we're back to oop.
>
> If the global-hierarchy was not made private (or any function for that 
> matter), then we could choose if we want to deal it with, or not.
> In my experience, making something private is only worth the trouble if we 
> give a complete substitute, that does everything and better.
> Let's say a rocket would explode if we set it to nil.. Then, just don't.
>
> With all that say, can we please remove the ^{:private true} from the 
> global-hierarchy definition?
> Sorry if I rant.
>
>

-- 
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