← back

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. #style is not yet implemented.

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 assembler or linker to build an executable