joetjen.net
EN DE
Programmiersprache

Praxis

Praxis ist ein Clojure-artiger Lisp, der für die BEAM und für JavaScript kompiliert. Compiler, Laufzeit, Standardbibliothek und Werkzeuge sind in Praxis geschrieben und kompilieren sich selbst. Die Sprache ist in aktiver Entwicklung und noch nicht veröffentlicht.

In Entwicklung · v0.63

Was es ist

Praxis nimmt Clojures Syntax — Literale für Vektoren, Maps und Sets, Sequenzfunktionen, Threading — und setzt sie auf die Semantik von Erlang/OTP: unveränderliche Bindungen, mehrteilige Funktionen mit Guards, Pattern Matching überall, Prozesse, Supervision und Hot Code Reload. Es ist ein Lisp-1 und homoikonisch; Makros werden mit Syntax-Quote geschrieben.

Auf der BEAM wird jeder Namespace zu einem gewöhnlichen .beam-Modul, das Erlang und Elixir wie jedes andere aufrufen können. In JavaScript wird jeder Namespace zu einem ES-Modul für Node oder den Browser. Interop ist direkt: Ein Praxis-Record ist ein Elixir-Struct, ein Praxis-Protokoll ein Elixir-Protokoll.

Ein erster Eindruck

demo.prax
(ns demo "A few functions.")

(defn split "Divides `total` among `people`."
  [total people] :spec [integer integer -> number]
  (/ total people))

(defn classify
  ([n] :when (< n 0) :negative)
  ([0] :zero)
  ([_n] :positive))

(split 4260 3)                  ; => 1420
(split 4250 3)                  ; => 4250/3
(seq/map [-5 0 7] classify)     ; => (:negative :zero :positive)
(-> "  night market " string/trim string/upper-case)
                                ; => "NIGHT MARKET"

Division ist exakt — 4250/3 ist ein Bruch, keine gerundete Gleitkommazahl. :spec deklariert die Signatur, aus der Dialyzer-Specs, TypeScript-Deklarationen und Property-Tests entstehen. Die Standardbibliothek nimmt ihr Subjekt zuerst, deshalb ist -> die Pipeline.

Gestaltung

  • BEAM-Konformität zuerst: Wo ein anderes BEAM-Werkzeug den Unterschied bemerken könnte, tut Praxis, was die BEAM tut.
  • Wenige Special Forms. cond ist die einzige primitive Verzweigung; if, when, and, or, case und with sind Makros darüber.
  • Ein Name behält seinen Wert. Neu binden ist ein Compilerfehler, wie in Erlang.
  • Zahlen laufen nie über, Division ist exakt: große Ganzzahlen, Brüche und Dezimalzahlen gehören zur Sprache.
  • Eine Quelle, zwei Maschinen. Portabler Code läuft unverändert auf der BEAM, unter Node und im Browser — Prozesse eingeschlossen.
  • Werkzeuge sprechen mit Menschen und Maschinen. Jeder prx-Befehl kann in JSON antworten, und ein MCP-Server gehört zur Toolchain.

Der Name ist griechisch: πρᾶξις, das Tun — Handeln, das sein Ziel in sich selbst trägt, im Unterschied zum Erkennen (theoria) und Herstellen (poiesis). Praxis ist das kompilierte Geschwister von Logos, dem einbettbaren Lisp; beide teilen eine spezifizierte Grammatik, aber keinen Code.

Die Werkzeuge

WerkzeugAufgabe
praxisKompiliert Dateien und führt Skripte aus; praxis explain PRX0208 erklärt eine Meldung
prxDas Projektwerkzeug: Manifest, Lock-Datei, Abhängigkeiten aus Hex, Git oder Pfaden, Tasks, Releases, Plugins
preplDer interaktive Prompt, mit Live-Neudefinition und :h für Dokumentation
Pluginsprx test, fmt, lint, check (Dialyzer, gemeldet in Praxis-Begriffen), doc, docset, bench, bundle, release, observer, ein Language Server, ein Debug-Adapter und ein MCP-Server
EditorenEine Tree-sitter-Grammatik und eine VS-Code-Erweiterung

Der MCP-Server lässt einen Agenten ein Projekt lesen und die eigene Arbeit prüfen, und seit v0.61 zeigt er auch, wie man Praxis schreibt: ein Korpus von Idiomen als Paare aus falsch und richtig, nach Thema abrufbar. Das Repository enthält mehr als die Sprache — Lictor, WebGlue, Ports von Cooper, Dextrin und Ichor und eine Reihe von Bibliotheken. Sie stehen unter Produkte.

Dateitypen

Die Endung sagt, für welche Maschinen eine Datei gedacht ist; ein Namespace kann außerdem angeben, was er braucht, etwa Prozesse oder blockierendes I/O, und eine Maschine, was sie bietet.

EndungFür
.praxjede Maschine
.praxenur die BEAM
.praxjJavaScript — Node und Browser
.praxn / .praxbnur Node / nur den Browser
.pxnDaten, etwa das Projektmanifest project.pxn

Wo es steht

Die aktuelle Version ist v0.63.0 (19. Oktober 2026), das dreiundsechzigste Minor-Release seit dem ersten Commit am 20. August. Die Phasen 0 bis 5 sind abgeschlossen: Compiler, Laufzeit und Werkzeuge sind in Praxis geschrieben und bootstrappen sich selbst, übrig ist nur ein kleiner Seed-Compiler in Elixir; es gibt drei Maschinen, die BEAM, Node und den Browser; und die Werkzeuge sind fertig und veröffentlicht. Die Sprache selbst ist seit v0.56.0 eingefroren.

Gearbeitet wird jetzt an einer Anwendung: Lictor, ein Moderationswerkzeug für Live-Streamer, gebaut auf WebGlue in der Reihenfolge, in der ein Nutzer ihm begegnet. Jede ihrer Etappen holt sich aus den Schichten darunter genau das, was sie braucht, und jede ist ein Release von allem, was sie geändert hat. Danach kommen Vervollständigung, Verteilung, ein stabiles öffentliches Praxis, die Buch-Werkzeuge, die Bücher und die Aufteilung in eigene Repositories.