After causing a "not defined" error from a function, that symbol seems to be an odd pseudo-defined state, so that I can't easily fix my error by "using" the correct module. (I can work around it by doing const plot = Winston.plot)
const plot = Winston.plot
julia> f() = plot() #some utility function that uses plot()
julia> f() #oops, forgot to add winston before calling f()
ERROR: in f: plot not defined
in f at none:1
julia> using Winston #ok, but what is this?
Warning: using Winston.plot in module Main conflicts with an existing identifier.
julia> plot #huh? now what?
ERROR: plot not defined
This happens because binding resolution (deciding where a global will be stored) is a separate step from actually assigning a value. By calling f(), you're forcing it to pick a location for plot, so it creates a global in the current module.
I was just about to refile this issue, since I've run into it frequently. @JeffBezanson, that's a descriptive answer, but does that mean this behavior is not fixable, or just that it's difficult to fix? Should this be labeled "won't fix"?
I ran into the same problem when trying to use the iterators module:
julia> for i in product(1:2,1:2)
ERROR: product not defined
in anonymous at no file
julia> using Iterators
Warning: using Iterators.product in module Main conflicts with an existing identifier.
Is this something that will be fixed eventually, or will we just have to always be careful to use using first?
This is issue #7864