Functions, procedures, and methods
Adama has three forms of colloquial functions: Functions, procedures, and methods.
Functions in Adama are pure in that they have no side effects and also are context-free. That is, the output of the function is 100% dependent on the inputs as decreed by Mathematics.
function square(int x) -> int {
return x * x;
}
On the other hand, there are procedures. A procedure can read state from outside of the function's scope. The reason for this distinction is for two reasons. First, the author has a Mathematics degree (and a chip on his shoulders) and feels the history of functions should be respected. Second, in a reactive environment, the important aspect is functions can't write state and thus cause non-determinism of a reactive read causing a write invalidating a reactive read in an infinite spiral of chaos.
int x;
procedure square_of_x() -> int {
return x * x;
}
We can also mark a procedure as readonly
since the ability to read state from outside a procedure is important for building complex results in bubbles and formulas
int x;
procedure square_of_x() -> int readonly {
return x * x;
}
public formula x2 = square_of_x();
The third form is a method which is a procedure attached to a record. Methods also support the readonly
annotation.
record R {
int x;
int y;
method foo() -> int readonly {
return x + y;
}
}
R z;
public formula z_foo = z.foo();