Skip to content

Roadmap and feature status

Implementation status for current and planned Prismio language, tooling, platform, and library capabilities.

Last verified

This page distinguishes shipped compiler behavior from intent. It does not assign release dates.

Area0.1 status
Self-hosted frontend and LLVM backendImplemented
Native Windows, macOS, and Linux CIImplemented
Ownership checks and AIFExperimental
Cross-compilation (--target, --sysroot)Implemented
WebAssembly past IRBlocked
Importable standard-library modulesImplemented
Terminal colours and styles (std.term), \e / \xHH / \u{…} escapesImplemented
Math (std.math): Float roots, rounding, logarithms, trigonometry, IEEE 754 constants; integer pow, gcd, floorMod, limitsImplemented
Integers of any width (Int<N>, UInt<N>) and the float types F16, F32, F64, F128, BF16Implemented
The standard traits (Eq, Ord, Copy, Default, Display, Key) for an unnamed-width Int<N> and for F16, F32, BF16, F128; print of those floats without import std.number_text; std.math on F32; a Vec of integers wider than 64 bitsComing Soon
Random numbers, checked integer arithmeticComing Soon
Standard input (std.input): lines, one line, or everythingImplemented
Time (std.time): Instant, Duration, the wall clock, sleepImplemented
Calendar dates, time zones, timersComing Soon
Files (std.fs): read, write, append, a line at a time, list, rename, remove, metadataImplemented
Environment variables and the process id (std.process)Implemented
panic, unreachable, assert, exitImplemented
A Never return type for a function that always failsComing Soon
Growing text in a struct field (StringBuilder)Implemented
Map removal and methods (m.get, m.remove, m[k], …)Implemented
Optional and Result methods (unwrapOr, expect, map, andThen, …)Implemented
None-coalescing a ?? bImplemented
from std import {io, vec}, the import group with the directory firstImplemented
fn main() with no return type and no return 0Implemented
Module qualifiers (std.string.trim(x))Implemented (calls only, by full import path)
Visibility: public, private, internalImplemented (functions, extern declarations, global lets, structs with their fields, and enums)
Selective imports (import m.name)Implemented
Aliased imports (import m as n)Coming Soon
Method call syntax and impl blocksImplemented
Traits and bounded genericsImplemented
Generics, monomorphization, and per-specialization container layoutImplemented
Inline storage for eligible Vec<T> structsImplemented
Slice<T> views of a Vec<T> and nested slicingImplemented
Local arrays with a written length (Array<T, N>, zero-filled; [T] when initialised), copied by valueImplemented
Arrays returned by value (-> Array<T, N>) and stored in struct fieldsImplemented
Fixed-length array parameters, compiled once per length; array fields in generic structs and enum payloadsComing Soon
Chunked Vec<T, N> and Vec<T, Chunk>, slices of arraysComing Soon
More collections: VecDeque<T>, sets, a sorted map, a priority queue, a linked listComing Soon
Programmer-directed AoS↔SoA data viewsExperimental (conversion, checked reads, mutation and round trip implemented)
else if chains, while, loop, repeat(n)Implemented
Ranges a..b (end included) and a..<b, with stepImplemented
for over String, Vec, Slice, arrays, Map and Iterator types, with (index, element)Implemented
Labelled loops: outer@ for …, break@outer, continue@outerImplemented
Descending ranges (10..0 counts down)Implemented
break with a value, if/match as expressionsComing Soon
Payload enums and ResultImplemented
Scalar optionals (Int?, Float?, an enum's T?) by value, in containersImplemented
Conversions: as T? that answer none, as String, text read at compile timeImplemented
An enum as its own type, exhaustive match over its variantsImplemented
ClosuresImplemented
Closure bounds (F: Fn(A) -> R), solving a result type from the closureImplemented
Inferred closure parameter types, storing or returning a closureComing Soon
User-written lifetimesComing Soon
Exceptions or result propagation syntax (?)Coming Soon
Tasks: spawn, join, Task<R>Experimental
async fn, lazy Future<T>, await, scope { }, spawn { }Experimental
Blocking typed channels: Channel<T>, for msg in cImplemented
Plain-data messages copied rather than boxedImplemented
select over channels, non-blocking send and receiveComing Soon
An await that gives its thread back, atomics, synchronization typesComing Soon
Macros and compiler plug-insComing Soon
Package manifest (build.ums) with profiles, project commands, native C sources, a lockfile and path dependenciesImplemented
Package registry and version solvingComing Soon
Importing modules from a path dependencyComing Soon
C++ sources in native, and static or shared library targetsComing Soon
Formatter, linter, and language serverComing Soon
Android and iOS toolchainsComing Soon

The twenty standard modules, from std.io and std.input to std.time and std.math, are ordinary importable modules; see the library status page. std.io is an import rather than a prelude, so a program that names no I/O carries none.

Channels are the exception to "a library is a module you import": Channel<T> and its methods — send, receive, share, close, length, free, and for msg in c — are lowered by the compiler, in the same category as a Vec's push and indexing, so they need no import. A send blocks while the channel is full and a receive blocks until a message arrives or the channel closes. See concurrency and async and await.

Generic functions are specialized before type checking and code generation reaches their bodies. Consequently, an eligible concrete Vec<Flat> instantiation may use inline storage while another instantiation of the same template remains boxed; there is no erased generic body that guesses the element representation at runtime.

WebAssembly is blocked, not in progress. Prismio emits wasm32 IR, but there is no C library for wasm32-unknown-unknown, so the runtime cannot be built for it from this repository — what print resolves to on the web is an embedder's decision. A cross build with no runtime bitcode for the requested triple says so and names the file it looked for. Cross-compilation to other targets works and has been built and run against x86_64-apple-macos.

impl is parsed and implemented: concrete specializations and generic inherent blocks such as impl<T> Box<T> attach methods, and x.f(a) is rewritten to f(x, a) before overload resolution. See methods and impl blocks. impl <Trait> for <Type> and impl<T: Bound> Trait for Box<T> are accepted and are how concrete or structurally matched types satisfy a bound. Applicability includes the impl bounds, and coherence rejects overlapping generic and concrete targets. Trait declarations and applications may also be generic, as in trait From<T>, impl From<Int> for String, and the bound U: From<Int>; trait arguments are part of applicability and coherence rather than being folded into a textual name.

Closures are implemented the same way, and it is the same mechanism: a closure is a struct plus a call function, resolved by overloading after monomorphisation, so there is no function pointer and no indirect call. Parameter types are written, the body is an expression, and captures are by value. See closures.

Traits are implemented as a static check, not a dispatch mechanism: a bound is verified at the instantiation, where the concrete type is known, and the trait method call is resolved by ordinary overload resolution. There are no trait objects and no vtables. Multiple bounds on one type parameter are joined with +, or written after the signature in a where clause. A trait may declare type parameters, default method bodies, supertraits, and associated constants, and an impl may be generic. See traits and bounds.

The keyword token for throw exists in the frontend, but no statement using it is parsed. Token presence is not implementation; its reference page stays Coming Soon until end-to-end tests establish otherwise.