1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
|
## Declarations
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 9223372036854775807
- `i8` - An 8-bit signed integer, -128 to 128
- `i16` - 16-bit signed integer, -32768 to 32767
- `i32` - 32-bit signed integer, -2147483648 to 2147483647
- `i64` - 64-bit signed integer (same as `int`, but more explicit about the size), -9223372036854775808 to 9223372036854775807
- `u8` - An 8-bit unsigned integer, 0 to 255
- `u16` - 16-bit unsigned integer, 0 to 65535
- `u32` - 32-bit unsigned integer, 0 to 4294967295
- `u64` - 64-bit unsigned integer, 0 to 18446744073709551615
- `float` - A 32-bit floating-point number, -3.40282347e+38 to 3.40282347e+38
- `f32` - 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+308
- `bool` - 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.
|