Skip to main content

Global variables

The FunC program is essentially a list of function declarations/definitions and global variable declarations. This section covers the second topic.

A global variable can be declared with the global keyword followed by the variable type and the variable name. For example,

global ((int, int) -> int) op;

int check_assoc(int a, int b, int c) {
return op(op(a, b), c) == op(a, op(b, c));
}

int main() {
op = _+_;
return check_assoc(2, 3, 9);
}

is a simple program that writes to a global functional variable op the addition operator _+_ and checks the associativity of addition on three sample integers; 2, 3, and 9.

Internally, global variables are stored in the c7 control register of TVM.

The type of a global variable can be omitted. If so, it will be inferred from the usage of the variable. For example, we can rewrite the program as:

global op;

int check_assoc(int a, int b, int c) {
return op(op(a, b), c) == op(a, op(b, c));
}

int main() {
op = _+_;
return check_assoc(2, 3, 9);
}

It is possible to declare several variables after the same global keyword. The following codes are equivalent:

global int A;
global cell B;
global C;
global int A, cell B, C;

It is not allowed to declare a local variable with the same name as an already-declared global variable. For example, this code wouldn't compile:

global cell C;

int main() {
int C = 3;
return C;
}

Note that the following code is correct:

global int C;

int main() {
int C = 3;
return C;
}

but here int C = 3; is equivalent to C = 3;, i.e., that is an assignment to global variable C, not a declaration of local variable C (you can find an explanation of this effect in statements).