Can anyone point me in the right direction of the files/functions in the 
core library where dispatch is handled?  I'd like to explore a little so I 
can make comments that account for the relative ease at implementing some 
of the changes suggested.  

I agree that it would be really nice, in some cases, to auto-merge function 
definitions between namespaces (database connects are very simple OO 
example).   However, if 2 different modules define foo(x::Float64, y::Int), 
then there should be an error if they're both exported (or if not an error, 
then at least force qualified access??)   Now in my mind, the tricky part 
comes when a package writer defines:

module MyModule
export foo
type MyType end
foo(x::MyType) = ...
foo(x) = ...
end


... and then writes other parts of the package depending on foo(5) to do 
something very specific.  This may work perfectly until the user calls 
"using SomeOtherModule" which in turn exported foo(x::Int).  If there's an 
auto-merge between the modules, then foo(x::MyModule.MyType), foo(x::Any), 
and foo(Int) all exist and are valid calls.

*If* the auto-merge changes the calling behavior for foo *within module 
MyModule*, then we have a big problem.  I.e. we have something like:

internalmethod() = foo(5)


that is defined within MyModule... If internalmethod() now maps to 
SomeOtherModule.foo(x::Int)... all the related internal code within 
MyModule will likely break.  However, if internalmethod() still maps to 
MyModule.foo(), then I think we're safe.


So I guess the question: can we auto-merge the foo methods *in user space 
only *(i.e. in the REPL where someone called "using MyModule, 
SomeOtherModule"), and keep calls within modules un-merged (unless of 
course you call "using SomeOtherPackage" within MyModule... after which 
it's my responsibility to know about and call the correct foo).

Are there other pitfalls to auto-merging in user-space-only?  I can't 
comment on how hard this is to implement, but I don't foresee how it breaks 
dispatch or any of the other powerful concepts.



On Thursday, April 30, 2015 at 12:19:07 PM UTC-4, Michael Francis wrote:
>
> My goal is not to remove namespaces, quite the opposite, for types a 
> namespace is an elegant solution to resolving the ambiguity between 
> different types of the same name. What I do object to is that functions 
> (which are defined against user defined types) are relegated to being 
> second class citizens in the Julia world unless you are developing in Base. 
> For people in Base the world is great, it all just works. For everybody 
> else you either shoe horn your behavior into one of the Base methods by 
> extending it, or you are forced into qualifying names when you don't need 
> to. 
>
> 1) Didn't that horse already bolt with Base. If Base were subdivided into 
> strict namespaces of functionality then I see this argument, but that isn't 
> the case and everybody would be complaining that they need to type 
> strings.find("string") 
> 2) To me that is what multiple dispatch is all about. I am calling a 
> function and I want the run time to decide which implementation to use, if 
> I wanted to have to qualify all calls to a method I'd be far better off in 
> an OO language. 
>
>
> On Thursday, April 30, 2015 at 2:15:51 AM UTC-4, Tamas Papp wrote:
>>
>>
>> On Thu, Apr 30 2015, Stefan Karpinski <ste...@karpinski.org> wrote: 
>>
>> > Function merging has these problems: 
>> > 
>> >    1. It complects name resolution with dispatch – they are no longer 
>> >    orthogonal. 
>> >    2. It makes all bindings from `using` semantically ambiguous – you 
>> have 
>> >    no idea what a name means without actually doing a call. 
>>
>> IMO orthogonality of name resolution and dispatch should be preserved -- 
>> it is a nice property of the language and makes reasoning about code 
>> much easier. Many languages have this property, and it has stood the 
>> test of time, also in combination with multiple dispatch (Common 
>> Lisp). Giving it up would be a huge price to pay for some DWIM feature. 
>>
>> Best, 
>>
>> Tamas 
>>
>

Reply via email to