Future plans: * Default-constructing (no arguments, zero-initialization) primitive types & struct types * Introduce type checking & inference as a separate pre-execution/compilation AST pass + add type information into expression nodes * Pointers: pointer types, address-of operator (&), dereferencing, scope-based lifetime tracking in interpreter * Function overloading: separate functions from values (again) in interpreter, allow casting to specific function type to take function value * C FFI: `foreign func sin(x : f32) -> f32` * Const propagation: annotate expression AST nodes that are computable in compile-time * Generic parameters: can be either values or `t : type`, but always compile-time * Generic structs: `struct array:`, require explicitly specifying parameters when instantiated (used as a type or creating a value) * Generic functions: `func max(a : t[n]):`, require explicitly specifying parameters when called or converted to function pointer * Generic parameter inference for functions & structs * Extension functions: operator overloading, destructors, iterators & for loop, move assignment (replaces built-in copy) * Metaprogramming: assigning types to variables (of type `type`), functions can take `type` as regular arguments and return `type`, all type computations are compile-time only Backlog: * Mutually recursive functions * Default-constructing primitive types * Empty array expression * Calling functions as methods