Great! +1 This will solve a lot of my problems about trying to maintain
good software engineering practices with Julia, (but not all, it doesn't
address being able to keep the implementation separate from the
abstraction...
I really don't want others to have the ability to play with my private
parts [as somebody else here so aptly put it])
Scott
On Monday, May 4, 2015 at 3:08:43 PM UTC-4, David Gold wrote:
>
> 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
>