Files
RustAst/docs/Refactoring_Block_Scoping_Statements.md
T
Michael Schimmel beb693a068 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.
2026-03-09 16:38:44 +01:00

2.7 KiB

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

  • 1. AST-Definitionen anpassen (nodes.rs, bound_nodes.rs)
  • 2. Parser-Logik umstellen (parser.rs) -> Option B umgesetzt.
  • 3. Binder Scope-Stack implementieren (binder.rs) -> Echtes Block-Scoping aktiv!
  • 4. TypeChecker, Analyzer, TCO, Dumper, Optimizer Updates (ERLEDIGT)
  • 5. VM Anpassung & Testing (ERLEDIGT)

2026-03-09: Fehlerbehebung & Stabilisierung (100% Pass Rate)

  • Letrec Semantik: VM pusht nun Platzhalter bei Define, bevor der Wert evaluiert wird, um lokale Rekursion (z.B. in Lambdas) zu ermöglichen.
  • 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.
  • Destructuring Rewrite: VM::unpack wurde von einer Array/Offset-basierten Logik auf eine rein rekursive Value-basierte Logik umgeschrieben, die "Stack Underflow" Fehler eliminiert.
  • 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.