That does sound like a really nice option. No chance of getting this?
On Friday, 20 May 2016 14:35:05 UTC+1, Tom Breloff wrote: > > Yes this is the best way (I think)... though part of me wishes there was > an empty module initialized in Base that could accept unsafe merging > without making your own independent module. So you could do something like: > > module A > type TA end > Base.Tmp.blib(::TA) = "I come from A" > end > > module B > type TB end > Base.Tmp.blib(::TB) = "I come from B" > end > > This isn't robust or scalable when there's a possibility of unintentional > name clashes without types defined in that module... however we don't > always have such strict requirements in real life. > > On Fri, May 20, 2016 at 9:20 AM, Milan Bouchet-Valat <nali...@club.fr > <javascript:>> wrote: > >> Le vendredi 20 mai 2016 à 05:53 -0700, Christoph Ortner a écrit : >> > I want to understand how to share methods across modules who don't >> > know of one another. I understand that this is discussed in various >> > places; I tried to go through may issues, but in the end I didn't get >> > a good picture of what I should do now. Long post - my question in >> > the end is: is creating an interface module the only (best) way to >> > achieve this right now, or are there better / more elegant / ... >> > constructs? >> Yes, I think that's the recommended solution, and I don't know of plans >> to change this. It can be a bit annoying, but it has the advantage of >> forcing collaboration to define common interfaces across >> modules/packages. You should be able to find threads about this in the >> archives where the arguments against automatically merging methods from >> different modules are developed. >> >> >> Regards >> >> > Consider this situation: >> > >> > module A >> > export TA, blib >> > type TA end >> > blib(::TA) = "A" >> > end >> > >> > module B >> > export blib, dosomething >> > blib(::Any) = "any" >> > dosomething(x) = blib(x) >> > end >> > >> > using A, B >> > dosomething(TA()) >> > >> > # "any" >> > >> > I want the output to be "A", but it will be "any", because module B >> > doesn't know about A.blib. The standard solution is this (?yes?): >> > >> > module B >> > export blib, dosomething >> > blib(::Any) = "any" >> > dosomething(x) = blib(x) >> > end >> > >> > module A >> > import B >> > export TA >> > type TA end >> > B.blib(::TA) = "A" >> > end >> > >> > using A, B >> > dosomething(TA()) >> > >> > # "A" >> > >> > However, this requires A to know about B (or vice-versa). Suppose now >> > that I want to be able to use functionality across modules that don't >> > know of one another, so this sort of import is not an option. The >> > *only* solution I see at the moment is to define a "super-module" >> > that specifies the interface >> > >> > module Super >> > export blib >> > blib() = error("this is just an interface") >> > end >> > >> > module A >> > import Super >> > export TA >> > type TA end >> > Super.blib(::TA) = "A" >> > end >> > >> > module B >> > using Super >> > export TB, dosomething >> > Super.blib(::Any) = "any" >> > dosomething(x) = blib(x) >> > end >> > >> > using B, A >> > dosomething(TA()) >> > >> > To repeat my question: is this the recommended way to achieve that A >> > and B should not have to know of each other? >> > >> > Long-term: how is this going to evolve, which are the most relevant >> > issues to follow? >> > >> > Any comments would be appreciated. >> > >> > Christoph >> > >> > >