Skip to content
Prismio docs
DraftPrismio 0.1.0

Roadmap and feature status

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

Last verified

Draft. Compiler-derived documentation that is not yet a frozen compatibility contract.

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
Module qualifiers (std.string.strTrim(x))Implemented (calls only, by full import path)
Visibility: public, private, internalImplemented (fn and extern fn; public is the default)
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 List<T> structsImplemented
Slice<T> list views and nested slicingImplemented
Programmer-directed AoS↔SoA data viewsExperimental (conversion, checked reads, mutation and round trip implemented)
Payload enums, Option and ResultImplemented
ClosuresImplemented
User-written lifetimesComing Soon
Exceptions or result propagation syntaxComing Soon
Tasks: spawn, join, Task<R>Experimental
Blocking typed channels: Channel<T>Implemented
Async functions, await, atomics, synchronization typesComing Soon
Macros and compiler plug-insComing Soon
Package manifest (build.ums), lockfile, path dependenciesImplemented
Package registry and version solvingComing Soon
Formatter, linter, and language serverComing Soon
Android and iOS toolchainsComing Soon

std.io, std.string, std.fs, std.process, std.list, std.map, std.option, std.key, std.ord and std.copy are ordinary importable modules; 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 seven operations are compiler builtins, in the same category as list_get and list_push, so they need no import. There is no executor and no await — a send blocks while the channel is full and a receive blocks until a message arrives or the channel closes. See concurrency.

Generic functions are specialized before type checking and code generation reaches their bodies. Consequently, an eligible concrete List<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.