Lyric
A statically typed application language with a bytecode VM — standalone, and embeddable in a host with a capability-based sandbox.
What changed in v2.0.0 — 2026-08-20
The specification is normative from this release on: lyriclang/lyric-spec defines the
language, the toolchain implements it, and a divergence is a toolchain bug. The major cuts the
SOURCE surface — everything the 1.x deprecation clocks announced — while the bytecode format
stays 3.2 and bytecode compiled against 1.x keeps loading.
Removed — the 2.0 cut
Everything @Deprecated announced through 1.x is gone from the source surface. The registry
still binds the old NATIVE names, so bytecode compiled against 1.x keeps loading; what the cut
takes is the ability to write the old forms in new code.
- The free string forms (
length(s),trim(s),toUpper(s), … — 27 declarations): the method API (s.length(), v1.15) is the one form.concatandrepeatstay free — they back+and*— and thefromXxx/parseXxxfamilies keep their names. - The free constructors
emptyList,emptyMap,emptySet,newStringBuilder: constructors live on the types (List<T>.empty(),StringBuilder.new(), v1.12). std.math.RandomandnewRandom: randomness lives instd.random(v1.14).write/writeln:print/printlntake anyDisplayvalue (v1.14).StringBuilder.length(): it counted appended PIECES, an implementation detail; measure the built string. (It never carried@Deprecated— an attribute cannot sit on a member — its doc announced the 2.0 removal instead.)
Changed
Hashable<T>declaresEquatable<T>as its parent. A hash table cannot exist without equality; demanding the hash without the comparison was a lie by omission. A key constraint isK :: [Hashable<K>]alone —Map,Setand their helpers dropped the second constraint. A type conforming toHashablenow implementshashANDequals.LYR-SEM0074is an error. Calling a static extension method through an instance was a warning through 1.x with the message announcing this change; the clock has run out. The one 1.x→2.0 severity change, recorded as such in the specification (§12.1).docs/Grammar.mdanddocs/Bytecode.mdare checked mirrors. The canonical home of both islyriclang/lyric-spec(chapters 02 and 13); CI diffs the copies here against the specification, so drift fails the build.- A library prunes from its
pubsurface. A compile without an entry point takes thepubfunctions of the compiled modules as reachability roots — a library's surface decides its contents, and the standard library no longer ships whole inside every library or embedded script. Observable at the host boundary: a private function nothing public reaches is not in the module (Definessays so), which is why this waited for the major.