Status icons
| Status | Meaning | |
|---|---|---|
| Done | Complete for current scope. Report gaps as bugs. | |
| In progress | Actively being implemented toward the done bar. | |
| Experimental | Exists in some form; not at the done bar yet. | |
| Planned | On the roadmap; not delivered yet. | |
| Omitted | Deliberately excluded from the language design. |
Language and types
| Status | Feature | Notes |
|---|---|---|
| Shapes and constraints | Structural types and built-in constraints; compile-time checks where values are static, runtime validation via ensure in the body today. Parameter prologue emission is future work. | |
ensure, is, and shape guards | Runtime checks tied to types; shape refinement on records. Successor narrowing after ensure works for simple identifiers; compound paths still open. | |
| Nil and presence checks | ensure x is Nil(), ensure !x, and *T .Present() / .Nil() on pointers. Not full optional value types yet. | |
| Type guards | Domain predicates with is (subject T) Name { … }; narrowing polish still open. | |
| Result and nominal errors | Result(S, F), error X { … }, and ensure / if x is Ok() narrowing. Closed nominal error unions (ParseError | IoError) emit sealed Go interfaces. Failure-type and export rules still maturing. | |
| Control-flow narrowing | If-branch refinement works; ensure-successor narrowing for simple identifiers works; compound paths and join across branches still open. | |
| Type aliases | Simple type Name = BaseType works end-to-end; broader alias semantics still evolving. | |
Binary types (A | B, A & B) | Union and intersection typedefs type-check; closed nominal error unions emit to Go and TS. General unions, intersections, and narrowing still incomplete. | |
Optional types (T | Nil) | Planned: Crystal-style T | Nil / T? unions, narrowing, and Go lowering. See optionals RFC. | |
| User-defined generics | Type parameters on types and functions. | |
Postfix ++ / -- and compound assignment | +=, -=, *=, /=, %=, &=, |= as standalone statements and in for post clauses (lang_probe/59_inc_compound). | |
| Shift / xor compound assignment | ^=, <<=, >>=, &^=—planned when ^, <<, >>, and &^ tokens and three-character lexing land. | |
| Slice subslice expressions | xs[low:high], xs[low:], xs[:high] on Forst []T values. Example: examples/in/slices.ft (task example:slices). | |
switch / select | Not implemented yet; design open for Go-style switch vs pattern match. |
Go interoperability
| Status | Feature | Notes |
|---|---|---|
| Transpile to Go | Packages, types, and functions emit as readable Go for go build. | |
| Validation from constraints | Compiler emits runtime checks from type constraints. | |
Providers (use / with) | Transitive obligation chains, Go lowering, and cross-package fixed-point (emit-time shims, no committed Go stubs). RFC GA gaps (LSP polish, discovery JSON, sidecar host patterns) remain. | |
| Import and type-check Go packages | go/packages loading and Forst↔Go call checking; common paths work, not full parity. Forst sibling imports in the same module resolve from .ft sources (not committed Go stubs). | |
| Variadic spread into Go calls | argv[1:]... at Go call sites. Example: examples/in/go_interop/cli.ft (task example:go-interop). | |
| Fields and methods on Go values | Dotted chains on Go-typed bindings (e.g. cmd.ProcessState.ExitCode()). | |
Mixed .ft and .go modules | Adopt beside hand-written Go in one module tree. | |
| Selectable Go emit target version | Emit for older go toolchains than the compiler uses today. |
Node interoperability
| Status | Feature | Notes |
|---|---|---|
forst generate (.d.ts) | Merged TypeScript declarations from .ft sources; shared ftconfig discovery with forst dev. | |
| Provider-free client surface | TS emit and sidecar wire stay data-only; functions with unsatisfied Providers(f) are omitted from exports. | |
forst dev HTTP API | /health, /functions, /invoke, /types, /version for local iteration. | |
| Sidecar invoke contract | Stable JSON POST /invoke from Node clients to a running dev server. | |
Built-in HTTP server + @forst/client | In-process /invoke in compiled Go binaries; generated flat exports. Pin in production. | |
@forst/sidecar and @forst/cli | npm/JSR packages; watch reload, optional debounced forst generate, and version checks. Pin in production. | |
| Client helper stubs | Thin generated helpers next to types.d.ts. | |
| Protobuf sidecar wire | gRPC / Connect as a future high-throughput alternative to JSON. | |
| Native ES modules / Node addon | Forst → Go → addon → ESM path; design exploration only. |
Tooling
| Status | Feature | Notes |
|---|---|---|
forst lsp core (HTTP) | Diagnostics, hover, completion, definition, references, rename, symbols, folding. | |
| LSP Go interop hover | Godoc and go/types signatures for qualified imports; module-level typecheck for cross-package Forst siblings. Go pkg. completion not yet. | |
| LSP formatting and code lens | Format document advertised; code lens and some code actions still minimal. | |
| VS Code extension | Marketplace + Open VSX publish on vscode-forst-v* releases. | |
forst test | Discover Test* in *_test.ft, emit Go tests and cross-package shims, run go test. Primary use: Providers wiring and cross-package integration. | |
CLI (run, build, generate, dev, lsp, test, fmt) | Core compiler commands via native binary or @forst/cli. | |
| Error message quality | Incremental improvements; diagnostics still vary by code path. |
Infrastructure
| Status | Feature | Notes |
|---|---|---|
| CI pipeline | GitHub Actions: coverage (task ci:test), E2E (task ci:e2e), compiler build. | |
| Release automation | release-please, git tags, npm/JSR publish workflows. | |
| Test coverage gate | Colocated Go tests and merged-statement coverage targets still expanding. |
Docs
| Status | Feature | Notes |
|---|---|---|
| This docs site (Mintlify) | Quickstart, language guides, interop, and workflow pages. Broader tutorials and migration guides still open. | |
| Contributing guide | Doc contribution notes exist; full dev-setup CONTRIBUTING.md still planned. |
What Forst omits
These are deliberate anti-features—not backlog gaps. Forst excludes them when they would hide control flow, surprise with errors, or break compile-time reasoning.| Status | Topic | Notes |
|---|---|---|
panic / recover as language constructs | Non-local, implicit control flow. Forst steers toward explicit Result and Go error returns. Generated Go or third-party code may still panic. | |
Exceptions (try / catch / throw) | Stack-unwinding surprises. Aligns with Go (T, error) and Result(S, F) instead of TS/Java-style exceptions. | |
| Class hierarchies and deep inheritance | Inheritance obscures which fields an API has. Forst favors structural shapes and function-centric APIs. | |
| Macros and preprocessors | Control-flow changes must use ordinary keywords, not compile-time rewrites that hide behavior. | |
| Runtime reflection for wiring | Providers, constraints, and obligation tracking are compile-time—not discovered via introspection at runtime. | |
TypeScript-style undefined | No dual null/undefined universe. Optionals direction is Nil and absence—see optionals RFC. | |
| Implicit numeric widening | Silent int↔float (and similar) conversions are rejected; casts stay explicit. | |
| Dependent types and type-level computation | No type families or template metaprogramming—keeps typechecking decidable and tooling fast. | |
| Runtime type mutation | No monkey patching; type definitions are fixed at compile time. |
Full roadmap
ROADMAP.md on GitHub
Feature parity tables, experimental gaps, RFC links, and infrastructure status.