Jolt is een self-hosted implementatie van de programmeertaal Clojure die gebruikmaakt van Scheme (via Chez of Gambit) in plaats van de Java Virtual Machine (JVM). De compiler is geschreven in Clojure zelf en kan code omzetten naar native binaries of JavaScript.
De belangrijkste kenmerken zijn:
- Standalone Binaries: Met
jolt build kunnen projecten worden gecompileerd tot één enkel uitvoerbaar bestand, waardoor een externe runtime zoals de JVM niet nodig is bij uitvoering.
- Technische Specificaties: Het ondersteunt echte concurrency via OS-threads en biedt volledige Clojure-semantiek voor persistente data, lazy sequences, transducers en multimethods.
- Compatibiliteit: Hoewel het grotendeels compatibel is met portable Clojure, zijn er enkele verschillen: er is geen algemene Java-interoperabiliteit (alleen een beperkte shim),
BigDecimal is niet beschikbaar en de regex-implementatie verschilt van die van Java.
Jolt kan eenvoudig worden geïnstalleerd via Homebrew of een installatiescript en ondersteunt nREPL voor REPL-driven development.
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:
| Aspect | Verschil |
| Java interop | Geen 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. |
| BigDecimal | Niet beschikbaar (decimal? is altijd false); de rest van de numeric tower komt overeen. |
| Regex | Gecompileerd 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.
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:
| Aspect | Verschil |
| Java interop | Geen 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. |
| BigDecimal | Niet beschikbaar (decimal? is altijd false); de rest van de numeric tower komt overeen. |
| Regex | Gecompileerd 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.