6.5 KiB
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
CaptureHostvirtuelle Zeit stellen und ein Korpusprogramm mitON TIMERdeterministisch prüfen. BREAKING für denHost-Trait. - Mausereignisse als vierte Quelle: Der
TerminalHostverwirft die Mausereignisse voncrosstermheute. 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 auchDOEVENTS()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 UEVENTundON SIGNAL(n%)je mitGOSUB label; die SteueranweisungenTIMER,KEY(n),UEVENTundSIGNAL(n)je mitON/OFF/STOPsowie die KlammerEVENTmitON/OFF; dazuSetUEvent. Wertebereiche nach Beleg:KEY0, 1–25, 30–31;TIMER1–86 400 Sekunden;SIGNAL1–2. Ihr Status im Inventar wechselt aufimplementiert. - Maskierung mit drei Zuständen:
ONstellt zu,OFFverwirft — auch ein unterSTOPbereits gemerktes Ereignis —,STOPmerkt eines und stellt es beim nächstenONzu. Der Eintritt in einen Handler führt selbsttätigSTOPseiner Quelle aus, dasRETURNselbsttätigON, außer im Handler stand ein ausdrücklichesOFF. SIGNALauf Betriebssystemsignale (Entscheidung 2026-09-04): Die Quelle des Vorbilds war OS/2-gebunden (Prozessflags überDOSFLAGPROCESS) und existiert nicht. Abgebildet wird die minimale Menge, die auf allen Zielplattformen besteht:SIGNAL(1)aufSIGINT,SIGNAL(2)aufSIGTERM. 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 beiINKEY$,INPUToderINPUT$erscheinen. - Namentliche Abweisung im Frontend: Die zehn Elemente erhalten
Grammatik und Signaturen. Heute rutscht
ON TIMER(5) GOSUB markestillschweigend in das berechneteON 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,
.FRMund die Dialoge (MSGBOX,INPUTBOX$) — eigene Changes derselben Phase. COM,PEN,PLAY,STRIGbleiben Non-Feature (Fehler 73).
Capabilities
New Capabilities
ereignissteuerung: Ereignisquellen (Tastatur, Zeit, benutzerdefiniert), Warteschlange und Reihenfolge, Zustellpunkte, Maskierung mitON/OFF/STOPje Quelle und global, Zustellung alsGOSUBin das laufende Programm, Zusammenspiel mit Fehlerbehandlung und blockierender Eingabe.
Modified Capabilities
sprach-frontend: Grammatik und Signaturprüfung SHALL die Trap-Anweisungen undSetUEventumfassen;ON <quelle>(n) GOSUBMUST NOT als berechnetesON ausdruck GOSUBbehandelt werden.vm-ausfuehrung: Die VM SHALL an Anweisungsgrenzen anstehende Ereignisse zustellen und dafür dasGOSUB-Ziel des Traps ausführen, ohne den unterbrochenen Zustand zu verlieren.kompat-testkorpus: Korpusabdeckung der Ereignis-Traps mit deterministischer Zeit.
Impact
crates/tb-runtime:Ereignisund derHost-Trait um die Zeitquelle erweitert (BREAKING); Trap-Zustände und Warteschlange inRtState;INKEY$-Puffer filtert getrappte Tasten;SLEEPendet bei Zustellung.crates/tb-vm: Zustellung als Vorgang der Ausführung (neue Instruktion und Frame-Behandlung);DOEVENTSerhält Wirkung.crates/tb-frontend: Grammatik und Signaturen der zehn Elemente;Unsupported-Absenkung vonSETUEVENTentfällt.crates/tb-ui:TerminalHostliefert die Zeit, reicht die Mausereignisse voncrosstermdurch, statt sie zu verwerfen, und meldet Betriebssystemsignale als Ereignis.tests/compat: neue Korpusprogramme für Zeit-, Tasten- und UEvent-Traps sowie fürON/OFF/STOP.docs/:sprachreferenz.md§8 ausformuliert;inventar.mdsetzt die zehn Einträge aufimplementiert;bibliothek.mdum die Elemente erweitert.- PLAN.md: die Eingangsaufgabe von Phase 4 und der Punkt „Klassische Ereignis-Traps" sind damit erledigt.