The Avail Programming Language

Module Bodies

Every module includes a module body. A module body is a lexical container of Avail source code, and as such comprises a sequence of top-level statements. The body of a module begins immediately after the keyword Body, which must always be the last keyword to occur within a module header.

A statement that occurs directly within a module body, rather than recursively with function definitions, is called a top-level statement. Following is an enumeration of the legal top-level statements:

  • A macro send that answers a statement:
    • A top-level variable declaration ("…:_†;" or "…:_†:=_;") introduces a module variable. A module variable is a mutable location that is able to store instances of a declared type. A module variable has module scope: it is visible to every expression within the module that occurs lexically after its definition (unless shadowed by a parameter, local variable, or local constant). The extent of a module variable will generally outlast its scope, since a module variable will typically be closed into a method definition.
    • A top-level constant definition ("…::=_;") introduces a module constant. A module constant is permanently bound to a specific value. A module constant has module scope. The extent of a module constant will generally outlast its scope, since a module constant will typically be closed into a method definition.
    • An assignment ("…:=_;") of a new value to a module variable.
    • An sequence is an immutable, ordered list of statements. A macro send can extend to multiple statements by answering a sequence.
    • An expression-as-statement that decorates an expression.
  • A message send of a -valued method definition. Method definers — like "Method_is_", "Semantic restriction_is_", "Grammatical restriction_is_", and "Seal method_at_" — and object type definers are the most common top-level message sends.

Below is a sample module, Fibonacci. Its body constitutes everything following the Body keyword, i.e., lines 37-74.

In practice, message sends are the most common top-level statements, followed by module constant definitions. Module variable declarations are rare, occurring in only a few modules of the Avail standard library. Top-level assignments are extremely rare; they never occur in the Avail standard library.

‹ Module Resolution | Return to Modules | Name Resolution ›