Jolt — Clojure op Scheme

Belangrijkste kenmerken

  • Volledige Clojure-semantiek: Persistente data, lazy seqs, transducers, multimethods en protocols.
  • Echte concurrency: future, agent, pmap en core.async op OS-threads.
  • Standalone binaries: jolt build produceert één enkel standalone binair bestand; er is geen Scheme of JVM nodig om dit uit te voeren.

---

Interactieve demonstratie

In de browseromgeving draait Jolt via de Gambit-backend, waarbij de code live wordt geëvalueerd in JavaScript. Er wordt gebruikgemaakt van een gereduceerde build om de download klein te houden, waardoor regex is weggelaten (dit zal een melding geven bij gebruik).

Voorbeeld in de REPL:

user=> (->> (range 10)
            (filter even?)
            (map #(* % %))
            (reduce +))
120

---

Waarom Jolt?

Self-Hosted Compiler

De compiler leest Clojure, analyseert dit naar een host-neutrale IR (Intermediate Representation), genereert Scheme en voert dit uit — native op Chez, of via Gambit gecompileerd naar JavaScript. De compiler is geschreven in Clojure en compileert zichzelf.

Standalone Binaries

Met jolt build wordt een project — inclusief runtime, standaardbibliotheek, app en afhankelijkheden — ahead-of-time gecompileerd naar één enkel zelfstandig uitvoerbaar bestand. Er is geen Chez, JVM of broncode nodig om het programma uit te voeren.

Echte Concurrency

future, promise, agent en pmap draaien op OS-threads over een gedeelde heap, wat overeenkomt met de JVM-semantiek. core.async biedt ondersteuning voor channels en go-blocks.

Volledige Numeric Tower

Jolt ondersteunt exacte integers en bignums, exacte ratio's ((/ 1 2) $\Rightarrow$ 1/2) en flonum doubles. De operator = is categorie-bewust; == test op waarde-gelijkheid.

Persistente Data

Immutable vectors (32-way tries), cons lists en HAMT maps/sets met Clojure-waardesemantiek. Transients zijn echte mutable scratch collections.

Clojure-Compatibel

Ondersteuning voor lazy/infinite seqs, transducers, destructuring, multimethods, protocols/records, metadata, namespaces, runtime eval en de volledige reader.

---

Snelstart

Installeer het zelfstandige Jolt-binair bestand; dit bevat de runtime, compiler en standaardbibliotheek, dus er hoeft niets anders te worden geïnstalleerd.

Via Homebrew:

brew install jolt-lang/jolt/jolt

Of via het installatiescript (Linux / macOS):

curl -sL https://raw.githubusercontent.com/jolt-lang/jolt/main/install | bash

Test de installatie:

jolt -e '(+ 1 2)'        # => 3

Uitvoeren vanuit een clone (vereist Chez Scheme): Er is geen build-stap nodig, aangezien de bootstrap seed is meegeleverd:

git clone --recurse-submodules https://github.com/jolt-lang/jolt.git
cd jolt
bin/jolt -e '(+ 1 2)'        # => 3

---

Gebruik

Een expressie evalueren

$ bin/jolt -e '(->> (range 10) (filter even?) (map (fn [x] (* x x))) (reduce +))'
# 120
$ bin/jolt -e '(/ 1 2)'
# 1/2

Een project uitvoeren

bin/jolt run -m myapp.core   # lost deps.edn op, voert vervolgens -main uit
bin/jolt -M:test [args]      # voert de :main-opts van een alias uit
bin/jolt path                # print de opgeloste source roots

Een standalone binair bestand compileren

bin/jolt build -m myapp.core -o myapp   # creëert één zelfstandig executable
./myapp arg1 arg2                        # kan overal worden uitgevoerd; args gaan naar -main

Gebruik --opt voor een geoptimaliseerde build en --dev voor een niet-geoptimaliseerde versie.

nREPL

bin/jolt --nrepl-server      # lost deps.edn automatisch op, schrijft .nrepl-port

Verbind via CIDER / Calva / Cursive middels het .nrepl-port bestand. Je kunt een var herdefiniëren en de volgende aanroep ziet dit direct zonder dat er een herstart nodig is. Voor meer informatie over het ontwikkelen tegen een live proces, zie REPL-Driven Development.

---

Verschillen met Clojure

Jolt streeft naar Clojure-semantiek, maar draait op Scheme in plaats van de JVM. De meeste portable Clojure werkt ongewijzigd (waaronder persistente collecties, de numeric tower, lazy seqs, transducers, multimethods, protocols/records, atoms, future/agent/pmap, core.async, runtime eval en de volledige reader).

De belangrijkste verschillen zijn:

AspectVerschil
Java interopGeen JVM, dus geen algemene Java-interoperabiliteit, reflectie of gen-class/proxy. Een beperkte subset van java.* is beschikbaar via een shim, samen met een C FFI.
BigDecimalNiet beschikbaar (decimal? is altijd false); de rest van de numeric tower komt overeen.
RegexGecompileerd door irregex in plaats van java.util.regex. Veelvoorkomende patronen werken, maar sommige Java-specifieke functies verschillen.

Jolt is open source onder de Eclipse Public License 1.0 en draait op Chez Scheme.