Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Notable omissions

Snail-Core is deliberately smaller than its first plan. These parts were dropped because they would cost more than they give the programs Snail-Core runs today; each can return if a program needs it.

Cut from the plan

  • The dependent elaborator. Generic code is served by Hindley–Milner checking with typeclasses, effect rows and monomorphization. Normalization by evaluation and implicit arguments would add type-level computation no program uses. The implemented ownership subset assigns grade 1 to Once and concrete records containing it; it has no general dependent elaborator or grade-polymorphic containers.
  • Checked interfaces. Separate compilation hashes each library’s interface to decide what to rebuild, but stores none: the compiled compiler checks Siegework, the largest program, in a fraction of a second, so an interface file would add a format and its invalidation without a measurable gain. Wire schemas come from the checked program.
  • The WGSL backend. The renderer’s shaders are WGSL text that shares no structs with Snail-Core code beyond fixed instance and material layouts. The runtime and graphics plan proposes shaders written as S-expressions.
  • Actor destinations. Tasks schedule one-shot closures. Mailboxes, request/reply protocols and network transports are application concerns.

Simplifications made on the way

  • Local bodies are sequential: a local function may call itself but not a later local definition.
  • Only unannotated top-level functions are generalized; other definitions are monomorphic unless they have a signature.
  • Effect labels take no type parameters, and operations are monomorphic.
  • Classes have no superclasses and no higher-kinded parameters.
  • Wire TypeIds are 32 bits, and every struct and enum value carries its case’s TypeId.

Some smaller features are planned but not yet implemented: complex numbers and mutable pairs in the dynamic Scheme libraries, mutually recursive local functions, superclasses, literals at a generic numeric type, and overflow-checked arithmetic. The language issue tracks these gaps.