5. Declarations

Variables must be declared before they are used. Aside from a few special cases, declarations have the following formats:

<qualifier> <type> <identifier> = <expression>;
<qualifier> <type> <identifier>;

Both declarations are creating a variable with an identifier of <identifier>, with type <type>, and optionally a type qualifier of <qualifier>.

The first declaration explicitly initializes the value of the new variable with the value of <expression>.

In Gazprea all variables must be initialized in a well defined manner in order to ensure functional purity. If the variables were not initialized to a known value their initial value might change depending on when the program is run. Therefore, the second declaration is equivalent to setting the value to zero.

For simplicity Gazprea assumes that declarations can only appear at the beginning of a block. For instance this would not be legal in Gazprea:

integer i = 10;
if (blah) {
  i = i + 1;
  real i = 0;  // Illegal placement of a declaration.
}

because the declaration of the real version of i does not occur at the start of the block.

The following declaration placement is legal:

integer i = 10;
if (blah) {
  real i = 0;  // At the start of the block. All good.
  i = i + 1;
}

The declaration of a variable happens after initialization. Thus it is illegal to refer to a variable within its own initialization statement.

/* All of these declarations are illegal, they would result in garbage
   values. */
integer i = i;
integer v[10] = v[0] * 2;

An error message should be raised about the use of undeclared variables in these cases. If a variable of the same name is declared in an enclosing scope, then it is legal to use that in the initialization of a variable with the same name. For instance:

integer x = 7;
if (true) {
  integer y = x;  /* y gets a value of 7 */
  real x = x; /* Refers to the enclosing scope's 'x', so this is legal */

  /* Now 'x' refers to the real version, with a value of 7.0 */
}

5.1. Special cases

Special cases of declarations are covered in their respective sections.

  1. Vectors

  2. Matrices

  3. Tuples

  4. Globals

  5. Functions

  6. Procedures