Coming from Go
Tape shares Go's commitment to simplicity and fast compilation. The biggest differences: no GC in t0/t1, no goroutines, and UI is a first-class concern.
generics / code generation
Go
Resisted generics for years, added them in 1.18. go generate for code gen.
Tape
Never adding generics. @tape {} is built-in code generation — same language, runs at compile time, type-safe.
concurrency
Go
Goroutines + channels. M:N scheduling. Lightweight, implicit.
Tape
Explicit thread declarations with typed events and on_done callbacks. No scheduler magic. You see every thread boundary.
memory
Go
GC handles everything. Escape analysis decides heap vs stack. No manual free.
Tape
Manual memory in t0. In t1 the compiler frees strings and other owned values at scope exit, with no GC. t2 scripts allocate from an arena, with a simple GC for long-running ones.
error handling
Go
val, err := foo() then if err != nil. Verbose, easy to forget.
Tape
let val = foo() or return — one line. Compiler won't let you ignore the error.
what stays the same
- - Fast compilation (single binary compiler)
- - No inheritance, composition over hierarchy
- - Structural interfaces (has .next()? iterable)
- - Produces a single executable (GUI programs ship their UI libraries beside it)