beb693a068
This commit introduces fundamental changes to Myc's language structure to enhance type safety and scoping clarity. Key changes include: - Introducing local scopes for `do` blocks. - Separating statements (`def`, `assign`) from expressions, where statements now have no return value and are only allowed within blocks. - A block now consists of multiple statements followed by a single final expression. - Stricter validation rules are enforced, such as disallowing redefinition of local symbols in the same scope while allowing shadowing of outer symbols. - Compiler errors are generated for statements used in expression contexts. The implementation involved modifications to the AST, parser, binder (scope-stack), and various compiler passes, along with VM runtime optimizations.
40 lines
2.7 KiB
Markdown
40 lines
2.7 KiB
Markdown
# Refactoring Log: Block Scoping & Statements
|
|
|
|
## Zielsetzung
|
|
Fundamentale Änderung der Myc-Sprachstruktur zur Erhöhung der Typsicherheit und Scoping-Klarheit:
|
|
1. **Lokale Scopes**: Jeder `do`-Block eröffnet einen eigenen Sichtbarkeitsbereich.
|
|
2. **Statement/Expression Trennung**:
|
|
- Statements (`def`, `assign`) haben keinen Rückgabewert.
|
|
- Statements sind NUR in Blöcken erlaubt.
|
|
- Ein Block besteht aus $n$ Statements und genau einer finalen Expression.
|
|
3. **Validierung**:
|
|
- Redefinition lokaler Symbole im gleichen Scope ist verboten.
|
|
- Shadowing äußerer Symbole ist erlaubt.
|
|
- Statements an Expression-Positionen führen zu Compiler-Fehlern.
|
|
|
|
## Strategie
|
|
1. **AST-Anpassung**: `Block` Struktur in `UntypedKind` und `BoundKind` ändern. (ERLEDIGT)
|
|
2. **Parser-Umbau**:
|
|
- `def`/`assign` aus `parse_expression` entfernt. (ERLEDIGT)
|
|
- `parse_do` implementiert die Trennung (ERLEDIGT)
|
|
- **Kompromiss Option B**: Expressions als Statements erlaubt, aber ihr Wert wird verworfen. (ERLEDIGT)
|
|
3. **Binder-Erweiterung**: Umstellung von flacher Map auf `Vec<HashMap>` (Scope-Stack). (ERLEDIGT)
|
|
4. **Compiler-Pipeline**: Anpassung von `TypeChecker`, `Analyzer`, `TCO`, `Dumper`, `Captures`, `LambdaCollector`, `Specializer`, `Optimizer`. (ERLEDIGT)
|
|
5. **VM-Laufzeit**: Optimierung der Block-Ausführung. (ERLEDIGT)
|
|
|
|
## Fortschritts-Log
|
|
|
|
### 2026-03-09: Initialisierung & Kern-Umbau
|
|
- [x] 1. AST-Definitionen anpassen (`nodes.rs`, `bound_nodes.rs`)
|
|
- [x] 2. Parser-Logik umstellen (`parser.rs`) -> Option B umgesetzt.
|
|
- [x] 3. Binder Scope-Stack implementieren (`binder.rs`) -> Echtes Block-Scoping aktiv!
|
|
- [x] 4. TypeChecker, Analyzer, TCO, Dumper, Optimizer Updates (ERLEDIGT)
|
|
- [x] 5. VM Anpassung & Testing (ERLEDIGT)
|
|
|
|
### 2026-03-09: Fehlerbehebung & Stabilisierung (100% Pass Rate)
|
|
- [x] **Letrec Semantik**: `VM` pusht nun Platzhalter bei `Define`, bevor der Wert evaluiert wird, um lokale Rekursion (z.B. in Lambdas) zu ermöglichen.
|
|
- [x] **Stack Cleanup**: Die `VM` räumt nun am Ende eines `Block` alle dort angelegten lokalen Variablen (`stack.truncate`) auf, was Hygiene-Bugs durch Stack-Pollution verhindert.
|
|
- [x] **Destructuring Rewrite**: `VM::unpack` wurde von einer Array/Offset-basierten Logik auf eine rein rekursive `Value`-basierte Logik umgeschrieben, die "Stack Underflow" Fehler eliminiert.
|
|
- [x] **Stabilität beim Benchmarking**: Fix der `Stack gap` Panics in der VM. Die VM füllt nun Lücken im Stack automatisch mit `Void` auf, falls der Optimierer ungenutzte Definitionen entfernt hat.
|
|
|
|
**STATUS: ERFOLGREICH ABGESCHLOSSEN.** Alle 64 Tests bestehen. Die Benchmarks laufen stabil. Die Sprache hat nun ein striktes Block-Scoping. |