Changelog

All notable changes to mino, following Keep a Changelog format.

All notable changes to mino are recorded here. The format follows

Keep a Changelog and the project

adheres to Semantic Versioning.

[0.17.0] — Proper tail calls and core library

Proper tail call optimization in the evaluator. All function calls in

tail position run in constant stack space, including mutual recursion.

Plus ~80 new core.mino definitions bringing the standard library close

to feature parity with core language functions.

Added

[0.16.0] — Complete C primitive layer

Adds every C primitive needed to implement the non-JVM parts of

clojure.core. The pure mino compositions come in a later version;

this version focuses on the C foundation.

Added

Changed

[0.15.0] — Test framework and dogfooding

Replaces all shell test scripts with mino-based tests. The language

now tests itself.

Added

Changed

[0.14.0] — Lazy sequences, complete C core, core.mino expansion

Lazy sequences land as a first-class type, enabling infinite data

structures and demand-driven evaluation. The C core gains its final

set of primitives; seven sequence operations move from C to lazy mino

implementations. core.mino nearly doubles in size.

Added

Breaking

[0.13.0] — Atoms, spit, stdlib architecture

Establishes the three-tier architecture: C runtime (irreducible

primitives), bundled stdlib.mino (macros and compositions), and

future mino-std package. Delivers atoms and spit.

Added

Changed

[0.12.0] — Release candidate (alpha)

Quality, polish, and documentation pass. No new language features.

Changed

Added

Verified

[0.11.0] — Sequences & remainder of stdlib

Sets, sequence transformations, string operations, and utility functions

round out the core standard library. Strict (non-lazy) semantics

throughout — every sequence operation returns a concrete list or

collection.

Added

Changed

Notes

[0.10.0] — Interactive development

The printer is now cycle-safe, def/defmacro record metadata for

introspection, and a new in-process REPL handle lets a host drive

read-eval-print one line at a time with no thread required.

Added

Changed

Notes

[0.9.0] — Sandbox, modules, diagnostics

Runtime errors now carry source locations and call-stack traces. Script

code gains try/catch/throw for recoverable exceptions. The core

environment is sandboxed by default — I/O primitives are installed

separately via mino_install_io. A host-supplied module resolver

enables require for file-based modules.

Added

Changed

Notes

[0.8.0] — Host C API

First draft of the embedding API. An external C program can now create a

runtime, register host functions, evaluate source, call mino functions,

and extract results — all in under 50 lines of glue code. The surface

language gains type predicates, str, and basic I/O. All new symbols are

mino_*-prefixed; the header remains marked UNSTABLE until v1.0.

Added

Notes

The header remains /* UNSTABLE until v1.0.0 */. API additions are

possible through the 0.x series; the v1.0 release freezes the ABI.

Execution limits are global rather than per-env; this simplifies the

implementation while a single-threaded model is the only supported

configuration. The mino_load_file function is the first place the

runtime performs host I/O on behalf of the caller; v0.9 will gate this

behind the capability model.

[0.7.0] — Tracing garbage collection

Replaces the per-allocation malloc/free discipline with a stop-the-world

mark-and-sweep collector. Every heap object the runtime produces — values,

environments, persistent-collection internals, and scratch arrays — is now

tracked by a single registry and reclaimed automatically once it becomes

unreachable. The surface language is unchanged.

Added

Changed

Notes

The collector is non-incremental and non-generational; the entire heap

is scanned on each cycle. For the sizes this runtime is meant to embed

at, linear scan over a sorted range index is a good fit, and the 2×

live-bytes threshold keeps mean pause time bounded. The v0.12 release

candidate will profile realistic workloads and decide whether to layer

on an incremental pass.

[0.6.0] — Macros

Lifts the surface language above its primitives. defmacro, quasiquote,

and a small set of in-language threading and short-circuit forms mean

that new control shapes can land without growing the C evaluator.

Added

Notes

0.x makes no automatic hygiene promise; macro writers should reach

for gensym when they need an identifier that can't capture anything

the caller introduced. The decision whether to keep gensym-only or

add full hygiene lands in v1.0 triage.

[0.5.0] — Persistent maps

Replaces the map layout with a 32-wide hash array mapped trie. get,

assoc, and update are now sub-linear; maps can be used as map keys,

equality between maps no longer scales quadratically, and lookup no

longer depends on key arity.

Changed

Added

Notes

The v0.5 HAMT is the last structural replacement before the GC work

in v0.7; from here the layout stays but the allocator underneath

changes. Semantics remain the contract.

[0.4.0] — Persistent vectors

Replaces the vector layout with a persistent 32-way trie without

changing the surface language. Every vector primitive from v0.3 behaves

identically; the work lives entirely behind the API.

Changed

Added

Notes

The naïve map layout from v0.3 is still in place. v0.5 replaces it

with a HAMT, again without changing the surface API. The semantics

are the contract, not the layout.

[0.3.0] — Literal vectors, maps, and keywords

Brings the value-oriented data model to the surface language. Programs

can now express structured data literally and manipulate it through

immutable collection primitives.

Added

Notes

The v0.3 representations (flat arrays for vectors and maps, linear

scan for map lookup) are intentionally naïve. The public contract is

the primitive signatures and semantics; v0.4 replaces the vector

layout with a persistent 32-way trie and v0.5 replaces the map with a

HAMT, both without changes to the surface API.

[0.2.0] — Core special forms and closures

Locks in lexical scope, first-class functions, and bounded-stack tail

recursion. The evaluator is now expressive enough to define factorial

and fib iteratively and to build and apply higher-order functions.

Added

[0.1.0] — Walking skeleton

The first published milestone. Establishes the single-file build, the

public C header, and an end-to-end read-eval-print pipeline.

Added