Roadmap
The AbySS interpreter already ships collections, artifact structs and methods, themed pattern matching, a browser playground, and VS Code tooling. The sections below outline what is delivered today, the next few release cycles in priority order, and the longer-horizon items still in design — including the staged path towards self-hosting.
Guiding priorities
Section titled “Guiding priorities”The ordering below follows four rules:
- Ship merged value first — work sitting on
developis released before new work starts. - Everyday gaps before new machinery — string helpers matter more than editor tooling while both are missing.
- Error handling before anything that can fail — file I/O and fallible stdlib APIs are designed after
fate/auguryexist, so nothing has to be retrofitted. - Deep semantic changes last — modules, enums, and generics land once the infrastructure they lean on is stable.
Vocabulary principles
Section titled “Vocabulary principles”AbySS’s reserved words are the language’s signature. New keywords are chosen by four tests, induced from the existing vocabulary (forge, ward, orbit, scribe, …):
- The metaphor explains the behaviour (
orbit= loop,ward= guard). - Five-to-seven characters, comfortable to type.
- Real English words without programming-language baggage.
- One concept, one word — no collisions or near-collisions (this is why the Option type is not called
echo: shell users readechoas “print”). - Theming is for keywords, types, and concept-defining APIs (
forge,fate,scribe). Everyday utility helpers keep their familiar names (min,max,sqrt,upper) — discoverability beats flavour where no metaphor adds meaning. This is a deliberate split, decided with the v0.6.x stdlib names.
Delivered
Section titled “Delivered”- Collection Types –
scroll,lexicon, andmaterialiterals plus standard rituals. - Artifact Structs & Methods – Typed schemas, literals, field mutation rules, and
TypeName::methodsyntax withcore/morph corereceivers. - Themed Pattern Matching (v0.5.0) –
oracleif-else and match modes,wardguard clauses, and scroll / artifact / lexicon destructuring. - Web Playground & Wasm (v0.6.0 cycle) –
crates/abyss-wasmadapter and a browser editor on this site, seeded with theexamples/programs. - Span-tracking & AST Overhaul (v0.6.0 cycle, pulled forward from v0.8.0) – AST nodes and
EvalErrorcarrystart..endbyte spans (runtime diagnostics underline the full offending range), the AST is split intoExpr/Stmt/Pattern, andEvalErrorgained structured variants. Pure infrastructure, no language change — it cleared the runway for the LSP. - Comment-preserving Formatter (v0.6.0 cycle) –
abyss alignre-emits comments beside the statements they accompanied, powered by the new spans. - Vocabulary Fixes (v0.6.0 cycle) – the two off-theme names were hard-switched while the user base is small: the
materiaconversion methodtrans→transmute(#524) and the loop-continue keywordresume→revolve(#525). A deprecation/warning channel arrives later with the LSP’s diagnostics model. - Multi-crate Workspace, Release Pipeline, Diagnostic Polish – as before: independent crates on crates.io, one-push releases with per-target binaries and the VS Code extension, and “did you mean?” hints throughout.
Release Plan
Section titled “Release Plan”Versioning follows the project’s 0.x.y convention (a 0.x.0 bump signals a potentially-breaking release; 0.x.y is compatibility-preserving).
v0.6.0 — Web Playground & Internal Overhaul (next release — everything is merged)
Section titled “v0.6.0 — Web Playground & Internal Overhaul (next release — everything is merged)”The release that ships the current develop: the browser playground plus the span/AST/formatter overhaul described above. All breaking API changes of this era (LineInfo removal, the Expr / Stmt / Pattern split, the semantic module removal) are concentrated in this single 0.x.0.
v0.6.x — Standard Library Essentials
Section titled “v0.6.x — Standard Library Essentials”Round out the everyday helpers as compatibility-preserving point releases. rune comes first — it currently has no methods, which is the biggest daily-use gap for a scripting language.
runemethods:upper,lower,contains,split,replace,trim,tally.scrollmethods:sort,unique,sum,min,max. Empty-scrollmin/maxraise an error for now; they move toauguryreturns in the v0.7.x API revision.- Math rituals that are sandbox-safe everywhere:
abs,sqrt,floor,ceil. Time rituals wait for the I/O design.
v0.7.0 — First-class Error Handling (shipped)
Section titled “v0.7.0 — First-class Error Handling (shipped)”Promote runtime failures from “interpreter prints a diagnostic and aborts” to a value scripts can handle. The artifact pattern type-dispatch shipped in v0.5.0 already supports the mechanics; this cycle standardises the types and adds the propagation operator. The Expr / Stmt split makes ? a straightforward postfix expression.
- Stdlib
fatetype (the themedResult):bless { value }/curse { reason }, ergonomic to construct and to destructure with the existing artifact patterns. - Stdlib
augurytype (the themedOption):manifest { value }/naught {}— an augury may reveal something, or nothing. - New
?propagation operator that early-returns thecurse/naughtvariant from the enclosing function:forge x: arcana = parse(input)?;. engravereturn-type support forfateandaugury, with call-time enforcement.- Fallible stdlib revision folded in from v0.7.x (a return-type change is breaking, so it belongs in the
0.x.0):scroll.min()/max()returnaugury,sqrtreturnsfate. try/recoverblock syntax stays deferred —?covers the bulk of the use cases.
v0.7.x — Scripting Ergonomics
Section titled “v0.7.x — Scripting Ergonomics”The quality-of-life layer that makes AbySS practical for real command-line scripts, as point releases.
invocation— a built-inscrollof script arguments (abyss invoke script.aby -- …); exit-code conventions forcurse-terminated scripts.aura— a built-inlexiconof environment variables (read-only to start).incant— string interpolation as a prefixed rune literal (incant "count: {n}"), additive so existing literals are untouched.perish(code)— explicit abnormal termination.- REPL improvements: multi-line editing and history search.
v0.8.x — LSP MVP
Section titled “v0.8.x — LSP MVP”The prerequisites (byte spans, the Expr / Stmt / Pattern AST) shipped early in the v0.6.0 cycle, so this can start any time after v0.7.0. Ship in stages so the VS Code extension layers source-aware features onto its TextMate grammar without waiting for a full implementation. The old SymbolTable scaffold was removed in that same cycle; the server builds a fresh span-aware resolver on the new AST.
- v0.8.0 –
crates/abyss-lspwith thetower-lspplumbing, exposing parser diagnostics over LSP. - v0.8.1 – Hover (types and
engravedoc strings), document symbols (outline view). - v0.8.2 – Completion (keywords, in-scope identifiers, methods on the receiver type), goto definition.
- v0.8.3 – Semantic-tokens highlighting; the TextMate grammar becomes a bootstrap fallback.
- v0.8.4 – Rename, plus broader workspace symbol search.
v0.9.0 — File I/O & OS Rituals
Section titled “v0.9.0 — File I/O & OS Rituals”Deliberately sequenced after v0.7.0 so every API returns fate from day one. Native-only, cfg-gated; the playground answers these rituals with the same “not available here” error summon uses. Files are tomes:
recite(path) -> fate— read a file into arune.inscribe(path, rune) -> fate— write.banish(path) -> fate— delete; plus an existence check.- Time rituals land here too, alongside the sandbox decision they share.
v0.10.0 — Module System
Section titled “v0.10.0 — Module System”Import / export across files, designed together with the workspace-level LSP features (workspace symbols, cross-file goto) that motivate it.
conjure "path/to/module";— bring a module’s bestowed names into scope.bestow— mark anengrave/artifact/forgeas exported.
Items still in design — sequencing depends on what falls out of the cycles above.
- Bytecode VM (promoted: this is the performance path) – Compile the AST to a compact bytecode with a register or stack VM. Typical 10–50× over tree-walking, keeps the Wasm playground story simple, and — crucially — becomes the compilation target a future self-hosted AbySS compiler emits. Sequenced before any native backend.
- Native compilation (Cranelift first, LLVM if ever) – Only worth opening after the VM exists and the type system has settled (enums, generics); a native backend added earlier would need reworking with every language change. Cranelift is the natural first step in a Rust workspace; LLVM only if peak performance or broad target coverage becomes a real goal. AbySS’s mandatory type annotations keep this door open.
familiar— first-class functions / closures (new) – A familiar is a bound spirit that captures its surroundings and serves its summoner: the perfect name for a closure. Not currently on any cycle, but self-hosting pressure (below) and stdlib ergonomics (sortwith a custom comparator) both pull it forward.- Generics + User-defined Sum Types (
rite) – Parameterise functions and data with type glyphs, and liftfate/auguryfrom special-cased artifacts to user-definable sum types. The v0.7.0 experience feeds this design. - Interpreter Performance, Packaging, Distribution – beyond the VM: debugging hooks, and a package story once modules have settled.
Self-hosting Milestones
Section titled “Self-hosting Milestones”The long-term flagship goal is an AbySS toolchain written in AbySS. It arrives in stages, and each stage doubles as a stress test of the cycles above:
| Stage | Milestone | Unblocked by |
|---|---|---|
| 0 | Self-lexing — an AbySS tokenizer for AbySS source | v0.6.x strings + v0.7.0 fate / augury |
| 1 | Self-formatting — align reimplemented in AbySS |
v0.9.0 file I/O, v0.10.0 modules, rite enums |
| 2 | Self-interpreting — an AbySS interpreter in AbySS, running (slowly) on the Rust interpreter | Stage 1 + familiar closures |
| 3 | True self-hosting — Stage 2 at practical speed, targeting the bytecode VM | the VM; realistically post-1.0 |
Track progress via the GitHub issue tracker or the project CHANGELOG.