Plum

Vision

What Plum is for, and what it is deliberately not.

Plum is a general-purpose ML-style language (OCaml/F# family: type inference, algebraic data types, pattern matching, Result-based errors) that does not need a garbage collector to get there.

That makes it usable in the places a collector rules out, which is where the design pressure came from: code that has to sit directly on a C ABI boundary without translation friction, work with hard latency requirements, and eventually constrained hardware. But the target is ordinary software first. See “Design decisions” below for what that ordering does and does not commit to.

The gap

Memory-management philosophy today is a triangle with an empty middle:

Roc has the memory model without the target audience. Austral has the target audience without the automatic model. That gap is empty because it’s genuinely hard, not because it’s unwanted.

The pitch

Plum is for people who want Rust’s reach (real hardware, real C interop, no GC) without Rust’s proof burden. You write code that looks like it assumes a garbage collector exists. The compiler makes it behave like it doesn’t.

Concretely, that means: reference counting plus compiler-driven functional-but-in-place optimization (mutate in place when uniquely owned, copy otherwise) as the memory model, invisible in the surface language: no linear types, no lifetime annotations, no borrow checker. You get predictable, GC-free memory behavior as a consequence of how the compiler treats ordinary-looking immutable code, not because you proved anything to it.

What Plum is not trying to be

Litmus test

If a proposed feature only makes sense assuming a garbage collector exists, it doesn’t belong in Plum.

Design decisions

Plum is a general-purpose ML-style language first (web APIs, CLI tools, games), not a systems/embedded language first. The memory model is justified by frame-time predictability and clean C FFI, not by fitting on a microcontroller; embedded reach is a welcome side effect, not the goal.

Most of what follows has since been built. This section records the decisions and says where each one stands; the full reasoning behind every one of them, including the ones that changed along the way, lives in DESIGN.md. If this section ever looks inconsistent with DESIGN.md, DESIGN.md is the one to trust, and README.md is the place to look for what is actually checked rather than claimed.

Generated from VISION.md in the repository.