3.7 KiB
Projekt-Protokoll: Finalisierung des Sprachdesigns für Zustand
- Datum: 09. Oktober 2025
- Zeit: 12:26 CEST
Motivation
Aufbauend auf dem initialen Entwurf eines sicheren Zustands-Modells geht es in diesem Schritt um die Konkretisierung und Verfeinerung des Sprachdesigns. Die Diskussion hat gezeigt, dass die Wahl der Schlüsselwörter (def, let) und die exakte Definition der Scope-Regeln entscheidend für die Intuivität und Sicherheit der Sprache sind. Ziel dieses Dokuments ist es, die finalen Entscheidungen festzuhalten.
Ziel
- Etablierung unmissverständlicher Schlüsselwörter: Die finalen Namen für die drei Zustands-Konstrukte (
atom,var,let) sollen deren Semantik klar und deutlich widerspiegeln. - Festlegung der Scope-Regeln: Die Rolle des
(do)-Blocks als primärer Scope-erzeugender Mechanismus für lokalen Zustand wird formalisiert. - Definition der Unveränderlichkeits-Garantie: Die Regeln für die Compile-Zeit-Überprüfung der Unveränderlichkeit von
let-Bindungen werden festgelegt.
Ergebnis: Das finale Drei-Säulen-Modell für Zustand
Wir haben uns auf ein klares Modell mit drei spezialisierten Konstrukten für die Zustandsverwaltung geeinigt, das maximale Sicherheit bei gleichzeitig hoher Flexibilität und Verständlichkeit bietet.
1. Die drei Konstrukte
Die folgende Tabelle fasst die Eigenschaften der drei finalen Konstrukte zusammen:
| Konstrukt | Geltungsbereich | Veränderlichkeit | Threadsicherheit |
|---|---|---|---|
atom |
Global / Geteilt | Veränderlich (atomar) | Ja (Design-Ziel) |
var |
Lokal (do-Block) |
Veränderlich | Nein (by Design) |
let |
Lokal (do-Block) |
Unveränderlich | Ja (da unveränderlich) |
2. Syntaktische Form
Alle drei Konstrukte folgen einer einheitlichen, einfachen Syntax für die Deklaration und optionale Initialisierung:
(atom symbol initial-value)(var symbol initial-value)(let symbol initial-value)
3. Implikation für (do)
Der (do)-Block (IBlockExpressionNode) wird zum zentralen und einzigen Mechanismus für die Erzeugung lexikalischer Geltungsbereiche für lokalen Zustand (var und let). Jedes Vorkommen von (do ...) öffnet einen neuen Scope, der nach Abarbeitung des Blocks wieder zerstört wird. Dies ermöglicht ein intuitives, imperativ anmutendes Programmieren mit klar definierten Lebenszeiten für lokale Variablen.
Nächste Schritte (Todo)
-
Parser anpassen:
- Die Schlüsselwörter
defundletwerden durchatom,varundletersetzt. - Alle drei Konstrukte werden initial zum selben
IVariableDeclarationNodegeparst. Eine Unterscheidung, um welches Konstrukt es sich handelt, wird im Binder getroffen.
- Die Schlüsselwörter
-
Binder anpassen (Kernaufgabe):
do-Scoping:VisitBlockExpressionwird so erweitert, dass es bei jedem Aufruf einen neuen Scope (EnterScope/ExitScope) verwaltet.- Symbol-Verfolgung: Der Binder muss für jede deklarierte Variable speichern, ob sie via
atom,varoderleterzeugt wurde. - Unveränderlichkeits-Prüfung: Beim Besuch eines
(assign ...)-Knotens (VisitAssignment) muss der Binder prüfen, ob die Zielvariable alsletdeklariert wurde. Wenn ja, wird ein Compile-Fehler ausgelöst. - Escape Analysis verfeinern: Die Sicherheitsprüfung wird so angepasst, dass sie nur noch bei Closures greift, die eine
var-Variable fangen. Closures, dielet-Variablen fangen, sind immer sicher.
-
RTL & Evaluator anpassen:
- Die Laufzeitlogik für
defwird zur Implementierung für(atom ...)und erzeugt einen atomaren Container. - Die RTL wird um die Funktionen
deref,reset!undswap!erweitert.
- Die Laufzeitlogik für