Files
TerminalBasic/openspec/changes/archive/2026-09-04-phase-4-ereignisschleife/proposal.md

126 lines
6.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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.