Based on recent discussions, it seems that at least some people would like
the option to have unqualified use of a function name dispatch "across"
modules when the argument on which the function is called unambiguously
specifies an exported method. While Julia doesn't do this automatically,
one option is for the user explicitly to "merge" functions defined in
different modules. I've been working on an implementation of this
functionality that doesn't require users to copy a bunch of method
definitions:
julia> using MetaMerge
julia> f() = nothing
f (generic function with 1 method)
julia> module A
export f
immutable Foo end
f(::Foo) = print("This is Foo.")
f(x::Int64) = x
end
julia> module B
export f
immutable Bar end
f(::Bar) = print("This is Bar.")
f(x::Int64) = 2x
end
julia> using A, B
Warning: using A.f in module Main conflicts with an existing identifier.
Warning: using B.f in module Main conflicts with an existing identifier.
julia> methods(f)
# 1 method for generic function "f":
f() at none:1
julia> merge!(f, (A,f), (B,f))
julia> methods(f)
# 3 methods for generic function "f":
f() at none:1
f(x1::Foo)
f(x1::Bar)
julia> f(A.Foo())
This is Foo.
julia> f(B.Bar())
This is Bar.
One can also use merge!() while writing modules to allow for unqualified
use of a name within the module, such as in the definition of h below:
julia> module C
export f
using MetaMerge, A, B
f(::Union()) = nothing
merge!(f, (A,f), (B,f), conflicts_favor=A)
h(x::Int64) = f(x)
end
julia> using C
Warning: using C.f in module Main conflicts with an existing identifier.
julia> C.h(2)
2
The repo is here: https://github.com/davidagold/MetaMerge.jl (I've never
versioned anything before, so I apologize in advance if the numbers seem
silly/arbitrary). I hope it can be useful to some. Folks should feel free
to leave suggestions, bug reports or requests for other kinds of
functionality that they'd like to see from something like this. I'll do my
best to accommodate, though I'm rather new to programming and hence cannot
make any promises.
Cheers,
David