+ numbers from 0 to 1: `.5` would be ambiguous following tuples, so is not supported.
- string
+ `"my string"` (double quotes)
+ `"it's called \"<insert name>\""` (escape inner double quotes with backslash)
+ all escape sequences
*`\"` double quote character
*`\\` backslash character
*`\n` newline
*`\r` carriage return
*`\t` tab
*`\0` null
- tuple
+ `[<val1> <val2> <val3> <...>]`
- list
+ `[<val1> <val2> <val3> <...> ...]` (like tuple, but `...]` instead of `]`)
- function
+ `(<arg1> <arg2> <arg3> <...>) <statement>` where `<argn>` is `<namen> <typen>`.
- thread
+ returned by the builtin function `thread()`
- reference
+ to a variable: `&<varname>`
+ to something else: usually using `get()` or its equivalent on a reference to a container instead of the container itself: `&list.get()` instead of `list.get()`
- enum
+ `<EnumName>: <statement>`
## Variables
- declaration and initialization
+ `<var_name> := <statement>`
+ can shadow previous variables with the same name: `x := 5 { x := 10 debug(x) } debug(x)` prints `10` and then `5`.
- assignment
+ `&<var_name> = <statement>`
* modifies the value: `x := 5 { &x = 10 debug(x) } debug(x)` prints `10` and then `10`.
+ `<statement_left> = <statement_right>`
* assigns the value returned by `<statement_right>` to the value behind the reference returned by `<statement_left>`.
* if `<statement_right>` returns `<type`>, `<statement_left>` has to return `&<type>`.
* this is why `&<var_name> = <statement>` is the way it is.
+ `***<statement_left> = <statement_right>`
* same as before, but performs dereferences: `&&&&int` becomes `&int` (minus 3 references because 3 `*`s), so a value of type `int` can be assigned to it.