We're planning to do something about this: #4345. When `using` two modules with conflicting names, we should do something other than pick one depending on order. Most likely we will print a warning, and require uses of the name to be qualified.
If the two modules really do want to define different methods for the same function, then either one has to import the other, or you have to use your SuperSecretBase approach. On Tue, Apr 21, 2015 at 9:37 AM, Michael Turok <[email protected]> wrote: > Note that this can be made to work by tearing a page from Base: we can a > module (SuperSecretBase), that defines a stub value() function. We then use > importall SuperSecretBase in each of Foo and Bar. But this means that any > module we create would need to declare its functions into SuperSecretBase. > > julia> workspace() ; include("mike.jl") > > julia> using Foo > > julia> using Bar > > julia> value(Bar.BarType()) > "Bar::value" > > julia> value(Foo.FooType()) > "Foo::value" > > julia> > > Modified code follows: > > module SuperSecretBase > value() = nothing > export value > end > > # ------------------------------ > > module Foo > > importall SuperSecretBase > > importall Base > type FooType end > > value(x::FooType) = "Foo::value" > get(x::FooType) = "Foo::get" > > export value > > end > > # ------------------------------ > > module Bar > > importall SuperSecretBase > > importall Base > > type BarType end > > value(x::BarType) = "Bar::value" > get(x::BarType) = "Bar::get" > > export value > > end > > > > > On Tuesday, April 21, 2015 at 9:26:01 AM UTC-4, Michael Turok wrote: >> >> Hi, >> >> What is the idiomatic way to create a function value() in different >> modules, dispatched on different arguments, without getting the >> warning/error about conflicting with an existing identifier? >> >> It seems like there is an order dependency with the example below. Seems >> like the 2nd module defines value(), unless you had already used value() >> prior to importing the 2nd module. >> >> Note that if I do the same with get() a function defined in Base, I don't >> get an error. >> >> Code and output from julia REPL below. >> >> Any help appreciated, >> Michael >> >> # this is mike.jl >> >> # ------------------------------ >> module Foo >> # ------------------------------ >> importall Base >> type FooType end >> >> value(x::FooType) = "Foo::value" >> get(x::FooType) = "Foo::get" >> >> export value >> >> end >> >> # ------------------------------ >> module Bar >> # ------------------------------ >> importall Base >> >> type BarType end >> >> value(x::BarType) = "Bar::value" >> get(x::BarType) = "Bar::get" >> >> export value >> >> end >> >> Using this in the REPL: >> julia> workspace() ; include("mike.jl") >> >> julia> using Foo >> >> julia> value(Foo.FooType()) >> "Foo::value" >> >> julia> using Bar >> Warning: using Bar.value in module Main conflicts with an existing >> identifier. >> >> julia> value(Bar.BarType()) >> ERROR: `value` has no method matching value(::BarType) >> >> # ----------------------------------------------------- >> >> julia> workspace() ; include("mike.jl") >> >> julia> using Foo >> >> julia> using Bar >> >> julia> value(Foo.FooType()) >> ERROR: `value` has no method matching value(::FooType) >> >> julia> value(Bar.BarType()) >> "Bar::value" >> >> # ----------------------------------------------------- >> >> julia> workspace() ; include("mike.jl") >> >> julia> using Bar >> >> julia> using Foo >> >> julia> value(Foo.FooType()) >> "Foo::value" >> >> julia> value(Bar.BarType()) >> ERROR: `value` has no method matching value(::BarType) >> >> julia>
