Optional Static Typing (Gradual Types)

Goals

  • Preserve SUP’s readability while enabling tooling (errors, IDE, optimization).
  • Opt‑in at file/function/variable level; type erasure at runtime unless --typecheck is enabled.

Surface syntax (proposed)

  • Type annotations via comment directives on headers:
sup
note types: add(a: number, b: number) -> number
define function called add with a and b
  return add a and b
end function
bye
  • Variables (optional): note type: x: number
  • Containers: list<number>, map<string, number> (for docs/tooling; enforced by linter/typechecker).

Type system

  • Primitives: number, string, bool, null
  • Structural containers: list, map
  • Functions: (T1, T2, ...) -> R
  • Union and optional: A | B, optional<T>

Checker

  • Separate tool suptype (future) validates annotations; LSP uses it for diagnostics if configured.
  • Gradual: missing annotations default to any and don’t block execution.