Refactor: Implement block scoping and statement separation

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.
This commit is contained in:
Michael Schimmel
2026-03-09 16:38:44 +01:00
parent 8339ee413e
commit beb693a068
26 changed files with 1057 additions and 948 deletions
@@ -0,0 +1,40 @@
# 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.