What Zig features do we deliberately NOT support?
Array iteration (for (array) |item|): our arrays don't carry length. Use for (0..count) |i| { arr[i] ... }.
@intCast / @as: type casting. Not needed -- everything is i64.
Pointers: restructure shared code to pass values, not addresses.
Complex initializers ([_]i64{0} ** 256): our arrays zero-initialize via the heap. Accept = undefined.
The rule: add a feature only when avoiding it would change the code's structure, not merely its spelling.
## Part 11: The Compiler, in Its Own Language
We've proven every piece individually. streq_mem compares strings. emit_byte, emit_s, emit_num write output. The scanner reads source bytes. Now we assemble them into a complete compiler -- written in the language we built, using every feature we added in Part 10.
Every function here compiles under both our compiler and the Zig compiler. That's the test: one source, two compilers, same result.
### I/O