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

Reply via email to