Phase 4: Ereignisschleife und klassische Traps

This commit is contained in:
2026-09-04 15:56:47 +02:00
parent 060674b466
commit 5cf5a6582c
40 changed files with 4024 additions and 176 deletions

View File

@@ -0,0 +1,125 @@
# Phase 4 (Eingang) — Ereignisschleife und klassische Ereignis-Traps
## Why
Phase 4 beginnt laut PLAN mit der Ereignisschleifen-Architektur. Diese
Architektur lässt sich an den **klassischen Ereignis-Traps** vollständig
bauen und beweisen, ohne eine Zeile Forms-Objektmodell: Sie brauchen
dieselbe Warteschlange, dieselben Zustellpunkte, dieselbe Maskierung und
denselben Rückruf in die VM, aber keine Formulare, keine Steuerelemente
und kein `.FRM`. Umgekehrt müsste der Entwurf der Schleife mitten im
Objektmodell blind bezahlt werden.
Phase 3 hat die halbe Maschinerie bereits nebenbei gebaut: die
`Ereignis`-Warteschlange, das Einsortieren in `RtState::pump`, die
Zustellpunkte an Anweisungsgrenzen und vor blockierender Eingabe sowie
den `CaptureHost` für Tests ohne Terminal. Es fehlen drei Dinge: eine
**Zeitquelle**, die **Maskierung** einzelner Ereignisquellen und vor
allem der **Rückruf in die VM** — heute gibt es keinen Weg, aus der
Laufzeit heraus eine Prozedur oder ein `GOSUB`-Ziel des laufenden
Programms auszuführen. `DOEVENTS()` liefert deshalb konstant 0.
Zugleich sind die zehn Ereignis-Elemente die letzte Lücke des Inventars
außerhalb von Forms: von den 15 offenen Einträgen entfallen zehn auf
diese Gruppe, drei auf die Forms-Dialoge und zwei auf Phase 5.
## What Changes
- **Ereignisquellen und Warteschlange**: Das Ereignismodell der Laufzeit
wird um eine **Zeitquelle** erweitert. Die Zeit kommt vom Host, nicht
aus einem direkten Uhrzugriff der Laufzeit — nur so kann der
`CaptureHost` virtuelle Zeit stellen und ein Korpusprogramm mit
`ON TIMER` deterministisch prüfen. **BREAKING** für den `Host`-Trait.
- **Mausereignisse als vierte Quelle**: Der `TerminalHost` verwirft die
Mausereignisse von `crossterm` heute. Sie werden aufgenommen und in
Zellenkoordinaten geführt — Tastendruck, Loslassen und Bewegung mit
Taste und Umschaltzustand. Die Eingangsaufgabe der Phase lautet
„Terminal-Events → Event-Queue → VM-Ticks"; die Maus ist ein
Terminal-Event und damit Teil der Schleife, auch wenn sie erst die
Steuerelemente auswerten.
- **Rückruf in die VM**: Ereigniszustellung wird ein Vorgang der VM, kein
Builtin. Ein zugestelltes Ereignis führt das `GOSUB`-Ziel seines Traps
aus und kehrt danach an die unterbrochene Stelle zurück. Damit
bekommt auch `DOEVENTS()` seine Wirkung.
- **Zustellpunkte**: Die vorhandenen Punkte (Anweisungsgrenze,
blockierende Eingabe) werden zu einer geschlossenen, dokumentierten
Liste ausgebaut: Anweisungsgrenze, `DOEVENTS`, `SLEEP` (wird durch ein
zugestelltes Ereignis beendet) und blockierende Eingabe. Zwischen
Zustellpunkten unterbricht nichts das Programm.
- **Klassische Ereignis-Traps** (Sprachreferenz §8, **10
Inventareinträge**): `ON TIMER(n&)`, `ON KEY(n%)`, `ON UEVENT` und
`ON SIGNAL(n%)` je mit `GOSUB label`; die Steueranweisungen `TIMER`,
`KEY(n)`, `UEVENT` und `SIGNAL(n)` je mit `ON`/`OFF`/`STOP` sowie die
Klammer `EVENT` mit `ON`/`OFF`; dazu `SetUEvent`. Wertebereiche nach
Beleg: `KEY` 0, 125, 3031; `TIMER` 186 400 Sekunden; `SIGNAL` 12.
Ihr Status im Inventar wechselt
auf `implementiert`.
- **Maskierung mit drei Zuständen**: `ON` stellt zu, `OFF` verwirft —
auch ein unter `STOP` bereits gemerktes Ereignis —, `STOP` merkt eines
und stellt es beim nächsten `ON` zu. Der Eintritt in einen Handler
führt selbsttätig `STOP` seiner Quelle aus, das `RETURN` selbsttätig
`ON`, außer im Handler stand ein ausdrückliches `OFF`.
- **`SIGNAL` auf Betriebssystemsignale** (Entscheidung 2026-09-04): Die
Quelle des Vorbilds war OS/2-gebunden (Prozessflags über
`DOSFLAGPROCESS`) und existiert nicht. Abgebildet wird die minimale
Menge, die auf allen Zielplattformen besteht: `SIGNAL(1)` auf `SIGINT`,
`SIGNAL(2)` auf `SIGTERM`. Signale erreichen die Laufzeit über den
Host, nicht im Signalkontext.
- **Getrappte Tasten verlassen den Eingabestrom**: Eine Taste, für die
ein aktiver `ON KEY`-Trap besteht, wird zugestellt und MUST NOT
zusätzlich bei `INKEY$`, `INPUT` oder `INPUT$` erscheinen.
- **Namentliche Abweisung im Frontend**: Die zehn Elemente erhalten
Grammatik und Signaturen. Heute rutscht `ON TIMER(5) GOSUB marke`
stillschweigend in das berechnete `ON ausdruck GOSUB` — genau der
Fall, den der Guiding Principle als Bug definiert.
**Non-Goals:**
- Die **Auswertung** von Mausereignissen durch Steuerelemente
(Trefferprüfung, Fokuswechsel, Ziehen) — sie setzt das Objektmodell
voraus und gehört zum Change der Steuerelemente. Quelle,
Warteschlange und Koordinatenmodell entstehen hier.
- Das Forms-Objektmodell, Steuerelemente, `.FRM` und die Dialoge
(`MSGBOX`, `INPUTBOX$`) — eigene Changes derselben Phase.
- `COM`, `PEN`, `PLAY`, `STRIG` bleiben Non-Feature (Fehler 73).
## Capabilities
### New Capabilities
- `ereignissteuerung`: Ereignisquellen (Tastatur, Zeit,
benutzerdefiniert), Warteschlange und Reihenfolge, Zustellpunkte,
Maskierung mit `ON`/`OFF`/`STOP` je Quelle und global, Zustellung als
`GOSUB` in das laufende Programm, Zusammenspiel mit Fehlerbehandlung
und blockierender Eingabe.
### Modified Capabilities
- `sprach-frontend`: Grammatik und Signaturprüfung SHALL die
Trap-Anweisungen und `SetUEvent` umfassen; `ON <quelle>(n) GOSUB`
MUST NOT als berechnetes `ON ausdruck GOSUB` behandelt werden.
- `vm-ausfuehrung`: Die VM SHALL an Anweisungsgrenzen anstehende
Ereignisse zustellen und dafür das `GOSUB`-Ziel des Traps ausführen,
ohne den unterbrochenen Zustand zu verlieren.
- `kompat-testkorpus`: Korpusabdeckung der Ereignis-Traps mit
deterministischer Zeit.
## Impact
- `crates/tb-runtime`: `Ereignis` und der `Host`-Trait um die Zeitquelle
erweitert (**BREAKING**); Trap-Zustände und Warteschlange in `RtState`;
`INKEY$`-Puffer filtert getrappte Tasten; `SLEEP` endet bei Zustellung.
- `crates/tb-vm`: Zustellung als Vorgang der Ausführung (neue
Instruktion und Frame-Behandlung); `DOEVENTS` erhält Wirkung.
- `crates/tb-frontend`: Grammatik und Signaturen der zehn Elemente;
`Unsupported`-Absenkung von `SETUEVENT` entfällt.
- `crates/tb-ui`: `TerminalHost` liefert die Zeit, reicht die
Mausereignisse von `crossterm` durch, statt sie zu verwerfen, und
meldet Betriebssystemsignale als Ereignis.
- `tests/compat`: neue Korpusprogramme für Zeit-, Tasten- und
UEvent-Traps sowie für `ON`/`OFF`/`STOP`.
- `docs/`: `sprachreferenz.md` §8 ausformuliert; `inventar.md` setzt die
zehn Einträge auf `implementiert`; `bibliothek.md` um die Elemente
erweitert.
- PLAN.md: die Eingangsaufgabe von Phase 4 und der Punkt „Klassische
Ereignis-Traps" sind damit erledigt.