Skip to content

Lambda 0.3 alpha release

Latest

Choose a tag to compare

@henry-luo henry-luo released this 01 Oct 12:19
· 1251 commits to master since this release
Immutable release. Only release title and notes can be modified.

Lambda Script 0.3 (alpha)

Released: 1st October 2026

Lambda 0.3 alpha is the largest release so far: about 6,500 commits over the six months since 0.2 (March 2026):

  • Lambda, the language, now has a normative specification, enforced type annotations, value semantics for mutable data, structured concurrency, and a new execution pipeline: a hand-written parser, an AST interpreter, and automatic tiering into the MIR JIT.
  • Radiant grew from a layout engine into an interactive document and UI engine: events, selection, forms, rich-text editing, animation, page scripting, basic web browsing, and reactive UI written in Lambda.
  • LambdaJS grew from an experimental transpiler into an ES2024 JavaScript engine that passes 40,261 Test262 tests and shares its runtime, DOM and event loop with Lambda.

Together, Lambda and Radiant are now one parser-to-pixel, end-to-end pipeline.

Lambda and Radiant document pipeline

This is an alpha. Syntax and semantics changed substantially since 0.2 and may change again.


Lambda

Language

  • Pipes and queries: |> maps, |: filters, that is a one-value proviso; for-expressions gain group by … into and joins.
    users |: ~.age >= 18 |> ~.name
  • Array operations: element-wise comparison ([1, 2, 3] gt 1), mask and index-array indexing, the last index, and computed keys.
  • String patterns: delimited \(…) patterns, usable wherever a type is.
    type Email = \(w+ "@" w+ "." a{2,6})
  • Error handlers: expr ^ { … } handles a failure in place.
  • Path literals redesigned for files, URLs and system data.

Type system

  • Enforced annotations: each is proven statically, rejected statically, or checked at run time.
  • Typed arrays T[], T[n], T[][] with unboxed storage.
  • New number model: saturating 53-bit int, sized integers and floats (255u8), arbitrary-precision integer and decimal.
  • Constrained types ({age: int} that (age >= 18)), type operators in expressions, and distinct fn/pn function types.

Procedures and concurrency

  • Mutable value semantics: assignment copies (copy-on-write underneath); var parameters are the only write-through.
  • Structured concurrency: tasks with start, wait, select, mailboxes and cancellation, without async/await.
  • Document updates (preview): put/del statements and transactions with commit/rollback.
  • Reactive UI: view/edit templates with state and on handlers.

Compiler and runtime

  • Hand-written C parser replaces Tree-sitter.
  • AST interpreter with automatic tiering into the MIR JIT, now the default. MIR Direct is the only back end; --c2mir is removed.

Packages and tooling

  • Modules: a lambda.* root, parent imports, and two-way imports with JavaScript.
  • New packages: graph (Mermaid, Graphviz, D2, Structurizr), pdf (experimental), dom, editor and edit.
  • New inputs: SQLite, Structurizr/C4, TikZ and TSV.
  • lambda edit: rich-text editing for Markdown and HTML, drawing for SVG, with lossless saving.
  • Formal specifications for semantics and design, and a ten-chapter tutorial with checked examples.

Breaking changes since 0.2

  • The pipe | is now |>, and the old |>/|>> file-output operators are replaced by output().
  • Filtering with xs that p or where is now xs |: p. Old that code still parses but means something different.
  • Error destructuring (let a^err = …) is removed; use expr ^ { … }. input() and parse() raise and must be handled with ^.
  • Assignment copies; let containers are immutable; var exists only inside pn.
  • Number literals: suffix n now means integer and m means decimal; negative indexes return null (use last).
  • Elements separate attributes from content with , (was ;); object literals are written <Point x: 1>.
  • A line that starts with (, [, - or < after a complete statement needs a ; before it.
  • String patterns are written type D = \(d+) (was string D = \d+).

Radiant

Layout and Rendering

  • Multi-column layout rewritten, with balancing, spanners and break control.
  • Custom layout in Lambda, which now drives diagram layout (Mermaid, Graphviz, D2, Structurizr).
  • Animation: a vsync frame clock, CSS @keyframes, a first set of transitions, requestAnimationFrame, GIF and Lottie.
  • Own SVG renderer and font engine: FreeType is removed; WOFF, WOFF2 and colour glyphs are supported.
  • Effects and content: blend modes, filters, clip-path, 3D transforms, a Canvas 2D subset, and experimental PDF viewing.

Interaction and editing

  • Unified event pipeline across JavaScript listeners and Lambda handlers, with IME.
  • Selection, form controls and contenteditable, with editing policy written in Lambda.
  • Basic web browsing in lambda view: http(s) pages, navigation history, parallel loading, cache and cookies.

Lambda JS

Conformance

  • Test262: 40,261 tests pass, none fail, at ES2024 scope (42,889 discovered; 2,628 skipped as out of scope). 0.2 had no Test262 run at all.
  • Out of scope for now: ES2025+ additions, intl402, Temporal, decorators and proper tail calls.

Engine

  • Two tiers, automatic by default: a new AST interpreter runs code first and promotes hot functions to the MIR JIT.
  • First-party parser for JavaScript and TypeScript, replacing Tree-sitter.
  • TypeScript: lambda ts file.ts runs TypeScript directly (annotations are stripped; there is no type checking).
  • One runtime with Lambda: JS values are Lambda values, with the same precise GC, typed-array storage and event loop. Lambda can import .js modules and JavaScript can import .ls modules.
  • Headless DOM scripting outside the browser: lambda js app.js --document page.html gives a script the real DOM, CSS cascade and layout metrics.
  • Web APIs: events, observers, CSSOM, fetch, XMLHttpRequest, storage, history, selection and clipboard.
  • JS libraries tested: lodash, ramda, rxjs, immer, marked, handlebars, acorn, ajv, zod and others.

Benchmarks

Lambda benchmark history

The latest run (Result50, 2026-09-30) covers 63 benchmarks against Node.js v22.13.0. Ratios are geometric means of each engine's time over Node's; below 1.0× is faster than Node.

Engine Workload time End to end, default tier
Lambda, typed 0.54× 1.32×
Lambda, untyped 1.05× 1.41×
LambdaJS 7.43× 8.86×
QuickJS (reference) 7.24× 1.26×

See the full report for per-benchmark results.