In toc, declarations have the following syntax:
<name> :[:] [type] [= expression];
The square brackets ([]
) indicate something optional.
All of the following statements
declare an new variable x
which is an integer, and has a value of 0:
x : int;
x : int = 0;
x := 0;
Note that in the first of those statements, although no expression
is specified, it defaults to 0. This is not true in C,
and there will eventually probably be an option to
leave x
uninitialized.
If you wanted x to be a floating-point number, you could use:
x : float;
x : float = 0;
x := 0.0;
Note that 0
can be used as both a float
and an int
eger, but
when no type is specified, it defaults to an int
, whereas 0.0
defaults to a float
.
Here are all of toc’s builtin types and their ranges of values:
int
- A 64-bit signed integer (always), -9223372036854775808 to 9223372036854775807i8
- An 8-bit signed integer, -128 to 128i16
- 16-bit signed integer, -32768 to 32767i32
- 32-bit signed integer, -2147483648 to 2147483647i64
- 64-bit signed integer (same as int
, but more explicit about the size), -9223372036854775808 to 9223372036854775807u8
- An 8-bit unsigned integer, 0 to 255u16
- 16-bit unsigned integer, 0 to 65535u32
- 32-bit unsigned integer, 0 to 4294967295u64
- 64-bit unsigned integer, 0 to 18446744073709551615float
- A 32-bit floating-point number, -3.40282347e+38 to 3.40282347e+38f32
- A 32-bit floating-point number (same as float
, but more explicit about the size)f64
- A 64-bit floating-point number, -1.7976931348623157e+308 to 1.7976931348623157e+308bool
- A boolean value, either false
or true
.char
- A character. The specific values are technically platform-dependent, but usually there are 256 of them.At the moment, it is not technically guaranteed that f32
/float
is actually 32-bit and that f64
is actually 64-bit; they are platform dependent. Perhaps someday there will be a version of toc which does not compile to C, where that could be guaranteed.
To make declarations constant, use ::
instead of :
. e.g.
x ::= 5+3;
y :: float = 5.123;
Here, “constant” means constant at compile time, not read-only as it does in C. One interesting thing about toc is that normal functions can run at compile time, so pretty much any expression is a valid initializer for a constant, e.g. doing x ::= some_function();
runs some_function
at compile time, not at run time.