+ I wonder if some kind of `-fast-compile` would be possible? By default I iterate over all definitions in a scope, but an idea for a future rewrite could be to start from main() and typecheck on demand, leaving untouched bits of code unchecked. Unsure how much time it would really save, but we could also add some kind of warning like `function never used` by later iterating over the unchecked stuff? In general I don't like how `actualize.c` works atm, at least generics instantiation (in particular the unification is currently annoying as fuck to deal with) + Currently the codegen is kind of bugged in that struct instances use the functions defined in the scope of the public part of the chain, one 'shortcut' would be to require that 'continue' matches the pub/private of the base struct, so public structs can only be continued publically and private structs privately? See `tests/struct_priv_trait_cont` for an example. + Build the consteval stuff OPTIMIZATIONS: + Use hashmaps or something similar for lookups for types and calls LOWERING: Structure handling in lowering could probably be as follows: Imagine struct something { i27 a; other_struct b; }; main () { // something s = {...}; i27 s_def = alloc $STRUCT_SIZE; // i27 a = s.a; i27 member_a = struct_def + 0; i27 a << struct_def 0; // other_struct c = s.b; i27 c_def = alloc $OTHER_STRUCT_SIZE; i27 member_b = struct_def + 3; c_def blit member_b, $OTHER_STRUCT_SIZE; // has to be added to qbt, // might need to be handled // like store with constant as // 'return'. Or can c_def be // considered an output value // for blit? /* calls just dump all registers down I guess, as do returns. No * implicit conversion to pointer and passed as first argument, ufcs * does that for us. */ } + Might want to add in some kind of suffix for integer types, s for i9 and l for i27 or something? + lowering could check if a function has been lowered and if not, lower it for us. Should it also check that no abstract data types are used in the final lowering? Which would mean that even the lowering is allowed to fail, and not just the actualization phase. + continue/break could probably fairly easily use labels as well, just check that the following AST node is a loop and treat is as the name for that loop. Then continue just goes to the bottom of the loop and break goes out of the loop, pretty much what we're currently doing but just with the top loop in the stack. We'd probably just have to check the loop stack in lower.c, should be fairly straightforward? + Function callbacks currently aren't treated as pointers, even though they really are under the hood. Unsure if I want to do something about it, one option could be to treat callbacks as their own thing but allow them to be casted to pointers?