No LLVM. No gcc. No C. zc carries its own assembler and PE linker, rebuilds itself in 0.12 seconds, and emits binaries that import exactly one DLL.
and / or / not, string interpolation, no semicolons. No pointers, no null, bounds-checked indexing — and a garbage collector written in Zephyr itself.
This is the full compile of the compiler, by the compiler — every stage in-house, replayed at actual speed.
The two features people bounce off missing are in. Type parameters are inferred from the arguments, closures capture by value, and the standard library is now ordinary Zephyr instead of compiler builtins.
Type parameters are inferred from the arguments — never written at the call site. Inference looks through [T], [K: V], T? and fn(T) -> U. Each instantiation is type-checked with T bound: contains gets the right == for int, str, or an enum, and an element type with no == is rejected. No trait system anywhere.
Function values are {code, env} cells. Capture is by value and transitive — outer(100)(20)(3) threads a captured name across two closure boundaries — and loop closures each keep their own copy of the loop variable. One deliberate rule: assigning to a captured variable is a compile error, because by-value capture would make it silently wrong.
contains, map, filter, fold, sort_by and friends used to be welded into the compiler. They now live in std/list.zeph as ordinary generic code — the snippet above is the real implementation. Nothing about lists is special-cased in the compiler anymore.
v0.2 — Generics (inferred monomorphization) and closures (by-value capture).
Standard library moved out of the compiler into std/list.zeph.
Zephyr is v0.2 and honest about it.