OpenSpec: phase-3-runtime-bildschirm archiviert, Delta-Specs gesynct
Zwei neue Capabilities in den Hauptspecs: - datei-eio: Dateiverwaltung, drei Zugriffsarten, UTF-32-Festtextfelder, Recordkonvertierung, Sperren, Dateisystem-Anweisungen - sprachinventar: das Vollstaendigkeits-Inventar als pruefbares Artefakt Fortgeschrieben: textbildschirm (Doppelzellen, Groessenunabhaengigkeit, Bildschirmanweisungen), konsolen-basisbibliothek (Host-Neuschnitt, volle String-/Format-/Datums-/Finanzbibliothek), kompat-testkorpus (Snapshot-Vergleich, Nachweis der Groessenunabhaengigkeit), sprach-frontend (Signaturpflicht, ON-ERROR-Scoping, DATA-Rohtext). Bilanz: +32 Anforderungen, 6 geaendert, 1 ersetzt. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,186 @@
|
||||
# Phase 3 (Kern) — Laufzeitbibliothek, Bildschirm und Datei-E/A
|
||||
|
||||
## Why
|
||||
|
||||
Phase 2 hat eine lauffähige VM geliefert, aber nur eine dünne
|
||||
Bibliotheksscheibe: rund 50 dokumentierte Anweisungen und Funktionen sind
|
||||
im Frontend zwar typgeprüft, senken aber auf `HStmtKind::Unsupported`/
|
||||
`HExpr::Unsupported` ab und enden zur Laufzeit in Fehler 73. Betroffen
|
||||
sind alle Bildschirmanweisungen (`CLS`, `LOCATE`, `COLOR`, `VIEW PRINT`,
|
||||
`CSRLIN`, `POS`, `INKEY$`), die komplette Datei-E/A, `PRINT USING`,
|
||||
die Datums-/Zeitfunktionen und die System-Anweisungen. Klassische
|
||||
Konsolenprogramme des Vorbilds laufen damit nicht.
|
||||
|
||||
Zusätzlich fehlt das Messinstrument: die Leitplanke „Vollständigkeit ist
|
||||
das Soll" fordert ein Inventar aller Anweisungen/Funktionen mit
|
||||
Abdeckungsstatus als Abnahmekriterium für Phase 6 — bislang existiert nur
|
||||
die Implementierungsseite (die `Unsupported`-Marker), nicht die Sollseite
|
||||
aus der Original-Hilfe.
|
||||
|
||||
Dieser Change löst den Plan-Meilenstein „klassische Konsolenprogramme
|
||||
laufen unverändert" ein. ISAM ist als eigener Change `phase-3-isam`
|
||||
ausgegliedert und schließt Phase 3 ab.
|
||||
|
||||
## What Changes
|
||||
|
||||
- **Vollständigkeits-Inventar** (`docs/inventar.md`): Tabelle aller
|
||||
Anweisungen, Funktionen und Metabefehle des Vorbilds aus der
|
||||
Original-Hilfe mit Status `implementiert` / `offen` / `Non-Feature`
|
||||
und Fundstelle. Ein automatischer Test gleicht die Tabelle gegen
|
||||
`builtin_fn`/`builtin_stmt` und die `Unsupported`-Marker im Code ab;
|
||||
Divergenz schlägt fehl. Damit misst sich die Abdeckung selbst.
|
||||
- **Bildschirmpuffer wandert nach `tb-runtime`** (Entscheidung
|
||||
2026-09-03, Explore-Session): `Cell`/`TextScreen` mit der kompletten
|
||||
Bildschirmsemantik (Cursor, Farbattribute, Scrollen, `VIEW PRINT`,
|
||||
`resize`) ziehen ratatui-frei von `tb-ui::screen` nach
|
||||
`tb-runtime::screen`. In `tb-ui` bleiben nur die Ratatui-Anbindung
|
||||
(`basic_color`, `impl Widget`) und künftig der Terminal-Adapter.
|
||||
Begründung: `PRINT`, `LOCATE`, `CLS` und `SCREEN()` sind Elemente der
|
||||
Laufzeitbibliothek und müssen den Puffer erreichen; zugleich bleiben
|
||||
`tb-vm` und `tb-runtime` damit frei von einer Terminal-Abhängigkeit,
|
||||
sodass jedes Bildschirmverhalten ohne Terminal prüfbar ist. Die
|
||||
Forms-Engine bleibt laut PLAN.md in `tb-ui::forms` (Entscheidung
|
||||
2026-09-03) und zeichnet von dort in denselben Puffer — `tb-ui` hängt
|
||||
künftig an `tb-runtime`, nicht umgekehrt.
|
||||
- **BREAKING: `Host`-Trait neu geschnitten**: statt `write(&str)` /
|
||||
`read_line()` künftig Präsentation eines Zellenpuffers und
|
||||
Ereignisabfrage. `write`/`read_line` können den Bildschirmzustand
|
||||
nicht transportieren (`LOCATE`, `COLOR`, `CSRLIN`, `SCREEN(r,c)` liest
|
||||
vom Bildschirm zurück). Betrifft `ConsoleHost`, `CaptureHost` und
|
||||
`tbc run`.
|
||||
- **BREAKING: Korpusvergleich auf Bildschirm-Snapshot** (getrimmt):
|
||||
`.out`-Dateien halten künftig das Textbild des Puffers bis zur letzten
|
||||
belegten Zelle statt eines Byte-Streams; eine Attributebene kommt nur
|
||||
hinzu, wenn das Programm `COLOR` verwendet. Die acht bestehenden
|
||||
Golden Files werden neu erzeugt. Ein Byte-Stream kann `LOCATE`/`COLOR`
|
||||
nicht abbilden.
|
||||
- **Bildschirmanweisungen und -funktionen**: `CLS`, `COLOR`, `LOCATE`,
|
||||
`WIDTH`, `SCREEN` (Anweisung und Funktion), `VIEW PRINT`, `CSRLIN`,
|
||||
`POS`, `INKEY$`, `INPUT$`, `TAB`, `SPC`, `KEY` (inkl. Klärung des
|
||||
Umfangs der Funktionstasten-Makros `KEY LIST`/`ON`/`OFF`).
|
||||
- **80×25 ist nirgends eine feste Grenze** (Vorgabe des Projektinhabers
|
||||
2026-09-03, Priorität für das ganze Programm): 80×25 steht stets als
|
||||
Synonym für „voller Bildschirm". Kein beobachtbares Verhalten darf eine
|
||||
feste Spalten- oder Zeilenzahl voraussetzen — `CLS`, der
|
||||
voreingestellte Scrollbereich, Umbruch- und Scrollgrenzen sowie die
|
||||
Bereichsprüfungen von `LOCATE` und `SCREEN()` folgen den aktuellen
|
||||
Abmessungen. Größenänderungen während der Ausführung werden als
|
||||
Ereignis zugestellt und angepasst (Inhalt oben links erhalten, Cursor
|
||||
und `VIEW PRINT`-Bereich geklemmt). Das Mindestmaß 80×25 bleibt
|
||||
ausschließlich eine untere Schranke der Darstellung.
|
||||
- **Breite Unicode-Zeichen belegen zwei Zellen** (Entscheidung
|
||||
2026-09-02): Zellenmodell, Cursorfortschritt, `POS`/`LOCATE` und
|
||||
Umbruch am rechten Rand berücksichtigen die Darstellungsbreite
|
||||
(unicode-width). Ersetzt die bisherige Regel „1 Zeichen = 1 Zelle".
|
||||
- **Vollständige String- und Zahlenbibliothek**: die restlichen
|
||||
dokumentierten Stringfunktionen sowie `PRINT USING` und `FORMAT$`
|
||||
vollständig, inklusive Klärung des `%`-Präfixes bei Feldüberlauf.
|
||||
- **Datums- und Zeitfunktionen**: `NOW`, `DATESERIAL`, `TIMESERIAL`,
|
||||
`DATEVALUE`, `TIMEVALUE`, `DAY`, `MONTH`, `YEAR`, `WEEKDAY`, `HOUR`,
|
||||
`MINUTE`, `SECOND` sowie `DATE$`/`TIME$` als Anweisungsform.
|
||||
- **Finanzmathematik** (Befund aus Aufgabe 1.1, 2026-09-03 — im
|
||||
ursprünglichen Umfang übersehen): `FV#`, `PV#`, `Pmt#`, `IPmt#`,
|
||||
`PPmt#`, `NPer#`, `Rate#`, `NPV#`, `IRR#`, `MIRR#`, `SLN#`, `SYD#`,
|
||||
`DDB#`.
|
||||
- **Record-Konvertierungsfunktionen** (ebenfalls Befund 1.1):
|
||||
`MKI$`/`MKL$`/`MKS$`/`MKD$`/`MKC$` und `CVI`/`CVL`/`CVS`/`CVD`/`CVC`
|
||||
sowie die MBF-Varianten `MKSMBF$`/`MKDMBF$`/`CVSMBF`/`CVDMBF` — sie
|
||||
gehören zum `FIELD`-basierten wahlfreien Zugriff.
|
||||
- **Weitere Befunde aus 1.1**: `CURDIR$`, `DIR$`, `CHDRIVE`,
|
||||
`SHELL` als Funktion, `LPOS`, `STACK` (Anweisung und Funktion),
|
||||
`SYSTEM`, `ERDEV`/`ERDEV$`, `SetFormatCC`.
|
||||
- **Signaturen für alle Inventarelemente**: Die Semantik führt für jedes
|
||||
im Inventar geführte Element eine Signatur, auch wenn das
|
||||
Laufzeitverhalten noch aussteht — sonst enden dokumentierte Elemente
|
||||
in „unbekannter Bezeichner" statt in einer namentlichen Ablehnung.
|
||||
- **Mathematik vervollständigen**: kompatibler `RND`/`RANDOMIZE`-PRNG
|
||||
(gleiche Zahlenfolge wie das Vorbild bei gleichem Startwert),
|
||||
Rundungsverhalten, Integer-Überlauf → Fehler 6.
|
||||
- **Datei-E/A**: `OPEN` in beiden Syntaxen (sequenziell, random, binär),
|
||||
`CLOSE`, `RESET`, `PRINT #`, `WRITE #`, `INPUT #`, `LINE INPUT #`,
|
||||
`GET`, `PUT`, `FIELD`, `LSET`, `RSET`, `SEEK` (Anweisung und
|
||||
Funktion), `EOF`, `LOF`, `LOC`, `FREEFILE`, `FILEATTR`, `LOCK`/
|
||||
`UNLOCK`, `NAME … AS`, `LPRINT`. Feste Strings in Records als UTF-32
|
||||
(Entscheidung 2026-09-02, 4 Bytes/Zeichen, feste Recordlänge).
|
||||
- **System-Anweisungen**: `FILES`, `KILL`, `CHDIR`, `MKDIR`, `RMDIR`,
|
||||
`SHELL`, `ENVIRON`/`ENVIRON$`, `CLEAR`, `FRE`, `TRON`/`TROFF`,
|
||||
plattformübergreifende Pfadsemantik.
|
||||
- **Drei Altlasten aus Phase 2**:
|
||||
- `ON ERROR GOTO`-Scoping: ein Handler-Label auf Modulebene ist auch
|
||||
aus Prozeduren heraus ansprechbar; heute wird nicht-lokales
|
||||
`ON ERROR` in einer Prozedur fälschlich wie `ON LOCAL ERROR`
|
||||
behandelt (`sema.rs`, `lower_stmt`/`OnError`).
|
||||
- DATA-Rohtext: unquotierte `DATA`-Elemente verlieren die Groß-/
|
||||
Kleinschreibung, weil der Lexer Bezeichner normalisiert.
|
||||
- `TODO verify`-Zellen der Konvertierungsmatrix in
|
||||
`docs/tbvm-design.md` gegen die Original-Hilfe auflösen
|
||||
(CURRENCY-Promotion mit Gleitkomma, `^`-Ergebnistyp,
|
||||
Exponentialform-Schwellen, CURRENCY-Ausgabeformat).
|
||||
|
||||
**Non-Goals:** ISAM (eigener Change `phase-3-isam`, schließt Phase 3 ab);
|
||||
Forms-Engine, Ereignisschleife und Ereignissteuerung (`TIMER/KEY(n) ON|
|
||||
OFF|STOP`, `ON SIGNAL`/`SIGNAL`, `SETUEVENT`, `MSGBOX`, `INPUTBOX$` —
|
||||
Phase 4); IDE und
|
||||
Debugger (Phase 5); `tbc build --exe` (Phase 6). Die Forms-Engine bleibt
|
||||
laut PLAN.md in `tb-ui::forms` (Entscheidung 2026-09-03); dieser Change
|
||||
schafft ihr mit dem Puffer in `tb-runtime` nur die Zeichenfläche.
|
||||
|
||||
## Capabilities
|
||||
|
||||
### New Capabilities
|
||||
|
||||
- `datei-eio`: Dateiverwaltung und Datenübertragung — `OPEN`/`CLOSE`,
|
||||
die drei Zugriffsarten (sequenziell, random, binär), Record-Layout mit
|
||||
UTF-32-Festtextfeldern, `FIELD`/`LSET`/`RSET`, Positions- und
|
||||
Statusfunktionen (`EOF`/`LOF`/`LOC`/`SEEK`/`FREEFILE`/`FILEATTR`),
|
||||
Sperren, Dateisystem-Anweisungen und plattformübergreifende
|
||||
Pfadsemantik.
|
||||
- `sprachinventar`: das Vollständigkeits-Inventar als prüfbares
|
||||
Artefakt — Aufbau der Tabelle, Statusvokabular, Pflicht zur
|
||||
Vollständigkeit gegenüber der Original-Hilfe und der automatische
|
||||
Abgleich gegen den Code.
|
||||
|
||||
### Modified Capabilities
|
||||
|
||||
- `textbildschirm`: Der Zellenpuffer SHALL in `tb-runtime` liegen und
|
||||
ratatui-frei sein; das Unicode-Zellenmodell wechselt von „1 Zeichen =
|
||||
1 Zelle" auf Darstellungsbreite (breite Zeichen belegen zwei Zellen);
|
||||
neue Anforderung für die Bildschirmanweisungen des Dialekts auf dem
|
||||
Puffer.
|
||||
- `konsolen-basisbibliothek`: Der `Host`-Trait wechselt vom Stream- auf
|
||||
ein Bildschirmmodell (Präsentation + Ereignisabfrage); die
|
||||
Funktionsliste wird von der Korpusscheibe auf die vollständige
|
||||
String-, Zahlen-, Formatierungs- (`PRINT USING`) und Datums-/
|
||||
Zeitbibliothek erweitert; `RND` erhält eine Kompatibilitätsanforderung.
|
||||
- `kompat-testkorpus`: Der Laufzeitvergleich wechselt vom Byte-Stream
|
||||
auf einen getrimmten Bildschirm-Snapshot; neue Abdeckungsanforderung
|
||||
für Bildschirm-, Formatierungs- und Datei-E/A-Semantik.
|
||||
- `sprach-frontend`: `ON ERROR GOTO` auf Modulebene SHALL aus
|
||||
Prozeduren heraus ansprechbar sein (bisher fälschlich lokal);
|
||||
unquotierte `DATA`-Elemente SHALL ihren Rohtext behalten.
|
||||
|
||||
## Impact
|
||||
|
||||
- `crates/tb-ui`: `screen.rs` verliert Puffer und Semantik an
|
||||
`tb-runtime`; zurück bleiben `basic_color` und `impl Widget` als
|
||||
Adapter auf den Runtime-Puffer. Neue Abhängigkeit `tb-runtime`
|
||||
(bisher waren beide Blätter im Abhängigkeitsgraphen); `forms.rs`
|
||||
bleibt als Platzhalter für Phase 4 unberührt.
|
||||
- `crates/tb-runtime`: neues `screen`-Modul; `host.rs` neu geschnitten
|
||||
(**BREAKING**); `strings`, `format`, `math`, `datetime`, `fileio`,
|
||||
`builtins` von Stub/Scheibe auf Vollimplementierung; neue
|
||||
Abhängigkeit `unicode-width`.
|
||||
- `crates/tb-frontend`: rund 50 `Unsupported`-Marker weichen echter
|
||||
Absenkung; rund 30 bislang signaturlose Elemente (Finanzmathematik,
|
||||
`MK…$`/`CV…`, `CURDIR$`, `DIR$`, `CHDRIVE`, `LPOS`, `STACK`, `SYSTEM`,
|
||||
`ERDEV`/`ERDEV$`, `SetFormatCC`) erhalten Signaturen; `sema.rs` (`ON ERROR`-Scoping), `lexer.rs` (DATA-Rohtext).
|
||||
- `crates/tb-vm`: neue Builtin-Indizes; `Instr::Unsupported` bleibt für
|
||||
die verbleibenden Phase-4-Marker bestehen.
|
||||
- `crates/tb-cli`: `tbc run` auf den neuen `Host`; Harness auf
|
||||
Snapshot-Vergleich (**BREAKING** für die acht bestehenden `.out`).
|
||||
- `tests/compat`: acht Golden Files neu erzeugt, neue Korpusdateien für
|
||||
Bildschirm, `PRINT USING`, Datei-E/A, Datum/Zeit, breite Zeichen.
|
||||
- `docs/`: neu `docs/inventar.md` und `docs/bibliothek.md`;
|
||||
fortgeschrieben `docs/sprachreferenz.md` (Doppelzellen, `KEY n`,
|
||||
`PRINT USING`-Überlauf) und `docs/tbvm-design.md`
|
||||
(Konvertierungsmatrix). PLAN.md-Haken folgen bei Abschluss.
|
||||
Reference in New Issue
Block a user