Coming from Zig
Tape and Zig are the most philosophically aligned — comptime over generics, explicit over implicit, no hidden allocations. The differences are in scope and target domain.
comptime
Zig
comptime keyword on params/blocks. Type is a first-class value. Generates code implicitly during instantiation.
Tape
@tape {} blocks run at compile time. @emit injects declarations explicitly. Every specialization is visible at the call site.
UI & components
Zig
No built-in UI model. Use C libraries (SDL, raylib) via @cImport. UI is purely a library concern.
Tape
Components are in the language: component, prop, event, view {}. Compiler generates vtables and handles lifecycle.
source structure
Zig
One language, one syntax everywhere. Tests via test "name" {} inline.
Tape
Source regions: #code, #view, #style, #test. Each has its own parser optimized for its domain. All emit the same TAC IR.
profiles
Zig
One mode. Freestanding or with std. You configure the allocator and target.
Tape
Three profiles per module: t0 (kernel/freestanding), t1 (typed apps), t2 (scripting with optional GC). Mix them in one project.
what stays the same
- - Comptime replaces generics — same philosophy
- - No hidden allocations, explicit allocators in low-level code
- - No exceptions — error returns with explicit propagation
- - No hidden control flow (no operator overloading, no RAII)
- - Single-binary toolchain (no external linker dependency)