Emacs-first · standard ECMAScript

Eliscript

A functional Lisp with persistent values, a compiler written in itself, and direct access to the modern JavaScript ecosystem.

175stable specifications
584checked library exports
35/35core criteria retained passing
2convergent compiler generations

One language, two compiler generations.

Plain Emacs builds the seed. The seed builds the compiler written in Eliscript. Both lower the same checked program through explicit IR into readable, source-mapped ESM.

01

Read Lisp

Parse located forms, persistent literals, modules, macros, and explicit host boundaries.

02

Prove semantics

Expand deterministically, resolve lexical identities, validate ownership, and reject invalid control flow.

03

Lower explicit IR

Both generations produce the same versioned representation, diagnostics, and Source Map locations.

04

Run standard ESM

Generated modules use ordinary JavaScript imports and execute under Bun, Node, browsers, and compatible tools.

Small forms, strong guarantees.

Switch between language mechanisms. The right pane describes the behavior the compiler and runtime preserve across both hosts.

language / executable semantics
Eliscript
(defun sum-to (n total)
  (if (= n 0)
      total
    (recur (1- n) (+ total n))))
Runtime contract
tail position verified
arguments evaluated once, left to right
function frame reused as a loop
constant JavaScript stack

A language core built around values.

Immutable data, open abstractions, deterministic tooling, and explicit host access form one coherent system. Frameworks remain consumers, never compiler architecture.

Persistent data

Share structure, not mutation

Linked Lists, 32-way Vectors, HAMT Maps and Sets, Queues, AVL-sorted collections, Records, metadata, and value hashing.

Construction

Transient when isolated

Owner-token Vector, Map, and Set builders reduce allocation while the compiler rejects lifecycle escape and reuse.

Abstraction

Protocols stay open

Collection protocols, transducers, lazy sequences, multimethods, and external type extensions compose without hidden framework rules.

Compiler

Self-hosted and reproducible

Reader, expansion, analysis, IR, emission, project planning, formatting, and evaluation converge across seed and self-hosted builds.

Emacs

Editor and execution loop

A major mode, Flymake diagnostics, persistent REPL, project watch, and a resilient worker return JavaScript performance to Emacs workflows.

Host boundary

JavaScript remains visible

Standard ESM, packages, promises, native containers, browser capabilities, and host calls are explicit and directly interoperable.

The maturity baseline is real. The language keeps moving.

All 42 implementation units, 35 mandatory verification criteria, and 173 stabilization units are complete in the retained core evidence. Future work is tracked without retroactively inflating that result; general automatic tail-call optimization begins as a Draft and Pending specification.