Is there ever a reason to call
Base.require directly, or is it a function that
is used only internally by
using, and I should never call it directly
and forget it exists?
Since the argument to
require is a module name, not a filename, which source file is loaded? How does it make the connection between the module name and the file name? The documentation says “When searching for files, require first looks for package code under Pkg.dir(), then tries paths in the global array LOAD_PATH”, but that seems somewhat ambiguous. By extension, since
require provides the implementation for
using, my question is really about how modules are found in those instances, too.
The Julia documentation on Modules says “Files and file names are mostly unrelated to modules; modules are associated only with module expressions”. However, some experimentation seems to indicate that there is a pretty direct link:
using MyModule has worked for me in exactly two cases:
There is a file
Pkg.dir()that defines a module
If the file
MyModule/src/MyModule.jldefines a different module than
MyModule, that module is actually imported (but not its exported names), but Julia shows a message
WARNING: requiring "MyModule" in module "Main" did not define a corresponding module.
MyModule/src/MyModule.jldefines one or more modules in addition
MyModule3), these modules are imported alongside “MyModule” (again, without their exported names). One can subsequently do
to get the exported names inMyModule2
, but there seems to be no way to getMyModule2
withoutMyModule`. So why would one define more than one module per file? (and arguably: why would this even be allowed?
There is a file
MyModule.jlin any directory in
LOADS_PATHS. The behavior is pretty much the same as for the package (the file must define the module
MyModuleand it behaves in the same way regarding other/additional modules defined in the same file.
Are these empirical rules I’m observing the official behavior? Is this spelled
out somewhere in the documentation, in a place I didn’t find?
So in essence it looks to me like Julia uses “Packages” as a way to distribute exactly one module (possibly with submodules, but submodules don’t seem to be encouraged, or at least I haven’t found any of the major packages that use them.
One more question: Is there a way to have multiple directories in