Valentin, thanks for your answer, but it seems like I need to give you some 
more context (sorry for not mentioning it earlier). I'm trying to repeat my 
experience of interactive development in languages like Python or Lisp. In 
these languages I can load some module/file contents to REPL ("__main__" 
module in Python, "user" namespace in Clojure, etc.) and play around with 
the code just like if I was "inside" of module under development. E.g. I 
can modify some function, send new definition to REPL and immediately try 
it out. I can also import any other modules/packages/namespaces. In Python, 
for example, being in __main__ (with loaded definitions from target module) 
I can refer to any other module on PYTHONPATH by its full name. Same thing 
with Clojure - any namespace on CLASSPATH is available for loading. 

In Julia there's Main module too. I can load some code and play around with 
it, just like in REPLs of other lanuages. E.g. I can start editor, open 
some file "linreg.jl", send all its contents to REPL, see how it works, 
update, reload, etc. Works like a charm... until I try to import another 
module. 

Unlike Python or Clojure, Julia's module system is decoupled from source 
files and directory structure. Correct me if I'm wrong, but it seems like 
there's no way to load module other than include() its source file. At the 
same time, I cannot include files all here and there. E.g. in example above 
when I work on module A (from REPL/Main) I cannot include "P.jl", because 
"P.jl" contains recursive include() of "a.jl", and they just re-include 
each other endlessly.

So the only way we can make it work is to load module system from the top 
level ("P.jl") and then refer to other modules with respect to it (e.g. 
like "using .A" or "import ..U"). It works fine with third party packages, 
but I find it really frustrating when working on some internal module (e.g. 
A). 

Thus any tips and tricks on loading modules when working from REPL/Main are 
welcome. 



On Sunday, August 24, 2014 5:38:53 PM UTC+3, Valentin Churavy wrote:
>
> What you are looking for is described in 
> http://julia.readthedocs.org/en/latest/manual/modules/#relative-and-absolute-module-paths
>  
> <http://www.google.com/url?q=http%3A%2F%2Fjulia.readthedocs.org%2Fen%2Flatest%2Fmanual%2Fmodules%2F%23relative-and-absolute-module-paths&sa=D&sntz=1&usg=AFQjCNFxpHj9YNC1JQ2Aag3qLpF97leT0w>
>
> in P.jl you include all your submodules 
> module P
>  include("u.jl")
>  include("a.jl")
>  include("b.jl")
>
>  using .A, .B
>
>  export f, g
> end
>
>  u.jl 
> module U
>  g() = 5
>  f() = 6
> end
>
> a.jl and b.jl both lokk like this
>
> module A
>  import ..U
>
>  f = U.f
>  g = U.g
>
>  export f, g
> end
>
> so one dot as a prefix looks in the namespace of the current module and 
> two dots as prefix looks in the namespace of the parent module.
>
> Hope that helps
>
> On Sunday, 24 August 2014 14:10:58 UTC+2, Andrei Zh wrote:
>>
>> Let's say I have following project layout: 
>>
>> P.jl that contains module P -- main package module, exposes code from 
>> a.jl and b.jl
>> a.jl that contains module A and
>> b.jl that contains module B -- some domain specific modules
>> u.jl that contains module U -- util functions
>>
>> Now I want to use functions in U from modules A and B. In simplest case I 
>> would just include("u.jl") inside of a.jl and b.jl, but this way functions 
>> from U will be defined in both - A and B. So I really want to import U, not 
>> include u.jl, but I can't do this since u.jl is not on the LOAD_PATH (and 
>> messing with it manually looks somewhat bad to me).  
>>
>> Is there some standard way to tackle it? 
>>
>> (Note, that A, B and U are here just for code splitting, other ways to do 
>> same stuff are ok too.)
>>
>

Reply via email to