- Easy
- Type checking on function calls
- Logical operators ( and / or / not )
- Bitwise ( and / or )
- Bitshift
- Modulo / multiplication / division
- Exponentiation
- Unary negation
- Grouping
- Functions not checking return type FIXME!
- Numerical hinting
- Explicit numerical type conversions
- Explicit return
- Break/contiue for loops
- Other loop types?
- Import functions from external
- Inline export syntax
- Export memory
- Add reserved names list to variable declaration
- Add global variables
- Fix block scopes outside of functions
- Read tuple values back!
- Tuple destructuring assignment
- Add type casting inference
- Allow assigning sized array to unsized array variable
- Optimise const lookups into sized arrays
- Hard
- Array types
- Structs
- Tuples
- Escape analysis
- Object scalerisation ( convert non escaping object to numnerous local variables to avoid alloc )
- Enums
- Generics
- Pointers
- Basic type inference
- Strings
- Full inference prepass
- Temporary memory allocation
- Module system
- Heap memory allocation
- Only insert malloc and memory export IF alloc is used
- Namespace objects ( useful for module system, static class methods, enums and foreign functions imports )