76 lines
2.1 KiB
Markdown
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
|
|
```
|