Canonical Names
In addition to the local name, every module also has a canonical name. The canonical name is a module root-relative logical name. A module's canonical name comprises a solidus /
(U+002F)
, then a module root name, then zero or many solidus-separated local names of enclosing packages, then a solidus, then the module's local name:
Consider the following file system structure:
This is an abridged file system snapshot of the avail
module root. The local name of the source module Infallible Primitives.avail
is Infallible Primitives
, and its canonical name is /avail/Avail/Foundation/Bootstrap/Infallible Primitives
. A module package representative is treated as having the same canonical name as its enclosing package. Therefore the canonical name of the Bootstrap.avail
representative is /avail/Avail/Foundation/Bootstrap
.
The canonical names of modules never appear in a module header. Import targets, such as are found in the private imports and extended imports sections, must be specified as local names. The programmer is forbidden from using a canonical name to specify an import target. This is a design point of Avail, and is not intended as a limitation, but rather a transfer of responsibility from the programmer to the system.[1] This does not absolve the programmer of all responsibility, however, because the programmer still has the obligations of:
- Correctly placing the modules into the file system in the first place so that they can be discovered at all.
- Understanding how the compiler or executor resolves local names to modules.
- Providing a suitable module renames file in the rare event that the programmer wishes to bypass the usual module resolution mechanism for a few specific cases.
[1] In most traditional programming languages, the burden of locating an import target falls to the programmer, who often has to supply a fully-qualified logical path.
‹ Module Discovery | | | Return to Modules | | | Module Renaming › |