126 lines
6.5 KiB
Markdown
126 lines
6.5 KiB
Markdown
# 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, 1–25, 30–31; `TIMER` 1–86 400 Sekunden; `SIGNAL` 1–2.
|
||
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.
|