Tobias, thanks a lot. From first link I figured out that if module name
matches file name, then I can actually import it directly. That is:

# U.jl
module U
f() = 42
end

# A.jl
module A
import U
U.f()
end


Which looks pretty obvious, so that's strange that haven't found it earlier.




On Mon, Aug 25, 2014 at 5:36 PM, Tobias Knopp <[email protected]>
wrote:

> There is https://github.com/JuliaLang/julia/issues/4600 but there was
> recently quite some dicussion on the julia-dev mailing list as well as
> https://github.com/JuliaLang/julia/issues/8014
>
> Cheers,
>
> Tobi
>
> Am Montag, 25. August 2014 16:29:03 UTC+2 schrieb Andrei Zh:
>
>> 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