Josh:
I do not fully appreciate the details of how modules get imported either.  
Here is what I can gather:

module moda
    export modvar, setmodvar
    modvar = 1
    setmodvar(x) = (global modvar=x)
end

module modb
    export modvar, setmodvar
    modvar = 2
    setmodvar(x) = (global modvar=x)
end

module modc
    using moda
    import modb
    println("using moda")
    @show modvar, moda.modvar, modb.modvar
    @show setmodvar(5)
    @show modvar, moda.modvar, modb.modvar
    @show modb.setmodvar(3)
    @show modvar, moda.modvar, modb.modvar
end

module modd
    import moda
    using modb
    println("using modb")
    @show modvar, moda.modvar, modb.modvar
    @show setmodvar(8)
    @show modvar, moda.modvar, modb.modvar
end

This gives the following results:
using moda
(modvar,moda.modvar,modb.modvar) => (1,1,2)
setmodvar(5) => 5
(modvar,moda.modvar,modb.modvar) => (5,5,2)
modb.setmodvar(3) => 3
(modvar,moda.modvar,modb.modvar) => (5,5,3)
using modb
(modvar,moda.modvar,modb.modvar) => (3,5,3)
setmodvar(8) => 8
(modvar,moda.modvar,modb.modvar) => (8,5,8)

So it looks like it is the same code in the background (at least the 
variables appear to be in a common address space).

So... it looks like import merely "makes visible"  the code at a module 
level...
And "using" first "imports", then "provides a shortcut" to the exported 
variables/functions...

But as far as I can tell, compilation is done "on demand".  I believe that 
the "real" compile step is done when we call a particular version of the 
code.  Compilation is actually a separate step from "using" and "import"


On Tuesday, March 3, 2015 at 11:48:53 AM UTC-5, Josh Langsfeld wrote:
>
> I'm curious about that workaround suggested in the FAQ, where you wrap the 
> function inside its own module. What is happening under the hood there? 
> Does it reinitialize the desired module entirely inside of the wrapper 
> module or does it just make a reference to some other compiled and 
> initialized top-level area? This is assuming the module has already been 
> built elsewhere and you just want easy local access to the exported symbols.
>
> On Monday, March 2, 2015 at 5:59:30 PM UTC-5, [email protected] wrote:
>>
>> The C++ "using namespace" and Julia "using module" are not quite the same 
>> thing.  The C++ namespace is a top level entity that is created and 
>> initialized as part of the C++ startup code and the "using" just makes the 
>> names of these global entities available within the scope.   The Julia 
>> "using" imports, and thus creates, the module for the first time, and Julia 
>> modules can contain statements that run at initialization, whereas C++ 
>> namespaces can only contain declarations.  
>>
>> But if the Julia "using" is within the function, when should the actual 
>> import and initialize and execute the statements be done?  Every time the 
>> function is called is very expensive.  Hoist the import out of the function 
>> to the top level, but doing this naively (ie putting the hoisted import 
>> just before the function) will then affect all code following the function 
>>  Have a "pseudo" top- level visible only to the function adds a complete 
>> new complication to the name management code.  But then what happens if the 
>> module is imported into two functions, how is its initialization managed? 
>> Or the top level and the function?
>>
>> So for now the "simpler is better" approach is to have the user manage 
>> importing at the top level only.
>>
>> Cheers
>> Lex
>>
>> On Tuesday, March 3, 2015 at 7:23:33 AM UTC+10, Josh Langsfeld wrote:
>>>
>>> It's discussed in the FAQ so there must be a good reason for it, though 
>>> no rationale is mentioned.
>>>
>>>
>>> http://docs.julialang.org/en/latest/manual/faq/#can-i-use-using-or-import-inside-a-function
>>>
>>> On Monday, March 2, 2015 at 3:00:21 PM UTC-5, Patrick O'Leary wrote:
>>>>
>>>> On Saturday, February 28, 2015 at 11:06:38 AM UTC-6, MA Laforge wrote:
>>>>>
>>>>> C++ provides "using namespace X" to "make available" the contents of X 
>>>>> to the current scope.  This even works on un-named scopes within a 
>>>>> function:
>>>>>
>>>>
>>>> (etc.)
>>>>
>>>> I know this is something that's come up before, and I think rejected--I 
>>>> think because it causes conflicts with multiple dispatch? But I can't seem 
>>>> to find the thread(s).
>>>>
>>>> I can't create a hard conflict in a quick mental search for an example, 
>>>> but I can create some level of confusion:
>>>>
>>>> module Foo
>>>>     bar::Int = 1
>>>> end
>>>>
>>>> module Baz
>>>>     bar::Float64 = 27.3
>>>>     with module Foo # not current Julia syntax
>>>>         bar #which bar is this?
>>>>     end
>>>> end
>>>>
>>>

Reply via email to