ava/namespaces.md

76 lines
2.1 KiB
Markdown

# Namespaces
_Namespaces_ are the primary organizational unit of Ava. Every Ava file _must_
define a namespace. The namespace is ALWAYS the first line of the file.
## Syntax
Each namespace is an ordered, delimited, list of [names](names.md). Each name is
separated by the `.` character.
```
<name>[.<name>]*
```
- At least one name MUST be specified.
- CANNOT contain more than one `.` character in a row.
- CANNOT begin with `.` character.
- CANNOT end with `.` character.
- CANNOT use a [Reserved Name](#reserved-names).
### Examples
- `foo`
- `foo.bar.baz`
- `language.v0`
- `collections.v0`
## Reserved Names
Any namespaces provided with a particular Ava distribution are considered
_reserved_. This means that, for example, the following namespaces cannot be
used:
- `language`
- `collections`
## Language Namespace
The `language` namespace is automatically imported into every Ava file.
## Exports
Each namespace MAY _export_ defintions using the `export` keyword. If some
definition is exported, it may be [imported](#imports) into another namespace.
Definitions are NOT exported by default -- it is an opt-in process. As noted in
the [Definitions](definitions.md) documentation, the `export` keyword may be
used at the beginning of _any_ definition.
## Imports
Imports immediately follow the namespace definition in each file. Each file may
have zero or more imports. Imports bring definitions from another namespace into
scope.
### Syntax
Each import is a single, fully-qualified name. Imported names MAY be mapped to
some alternative name. An import may refer to a specific namespace or it may
refer to some specific definition within a namespace.
TODO: Account for type classes. How can we easily import instances? One option
is to NOT do this. Ever. Just resolve EVERY possible `instance` during
compilation and make them available within the scope of the program. Global.
Very strict one-instance-per-thing side-effect, but could be useful.
```
import <namespace>[.<definition name>] [as <name>]
```
### Examples
```
import collections.NonEmptyList as NEL
import collections.Queue
import collections
```