Files
TerminalBasic/openspec/changes/phase-3-isam/proposal.md
Chili Palmer 52ccbb5848 Phase 3 (Kern): Laufzeitbibliothek, Bildschirm und Datei-E/A
Setzt den OpenSpec-Change phase-3-runtime-bildschirm um (77/77 Aufgaben).
Abdeckung laut Inventar: 195 implementiert, 37 offen, 53 Non-Feature.

Vollstaendigkeits-Inventar
- docs/inventar.md mit 285 Eintraegen aus den Themenlisten von
  bas7advr.hlp und qb45advr.hlp, je mit Status und Fundstelle
- crates/tb-frontend/tests/inventar.rs haelt die Tabelle in beide
  Richtungen gegen den Code; der Abdeckungsstand kann nicht veralten

Bruchschritt (Puffer, Host, Korpus)
- Cell/TextScreen ziehen ratatui-frei nach tb-runtime::screen; tb-ui
  behaelt Farbabbildung, Widget und den neuen Terminal-Host
- Host wechselt vom Zeichenstrom auf Anzeige des Zellenpuffers plus
  Ereignisse (Taste, Groessenaenderung, Abbruch)
- Korpusvergleich auf getrimmten Bildschirm-Snapshot; die acht
  bestehenden Sollausgaben blieben dabei unveraendert

Groessenunabhaengigkeit
- 80x25 ist nirgends mehr eine feste Grenze; Groessenaenderungen waehrend
  der Ausfuehrung werden zugestellt (Inhalt oben links erhalten, Cursor
  und VIEW PRINT geklemmt)
- Korpusnachweis: dasselbe Programm bei 80x25 und 120x40 mit je eigener
  Sollausgabe, plus ein Programm mit Groessenwechsel mitten im Lauf

Bibliothek
- Breite Unicode-Zeichen belegen zwei Zellen (Cursor, POS, Randumbruch)
- Bildschirm: CLS, COLOR, LOCATE, WIDTH, VIEW PRINT, SCREEN, CSRLIN, POS
- Tastatur: INKEY$, INPUT$, Funktionstasten-Makros (KEY n / LIST / ON)
- PRINT USING, LPRINT USING, FORMAT$, SetFormatCC
- Mathematik mit kompatiblem PRNG (gleiche Saat, gleiche Folge)
- Datum und Zeit mit Serienwerten ab 1899
- Finanzmathematik: FV#, PV#, Pmt#, IPmt#, PPmt#, NPer#, Rate#, NPV#,
  IRR#, MIRR#, SLN#, SYD#, DDB#
- Datei-E/A: sequenziell, RANDOM (Recordpuffer und UDT-Variablen),
  BINARY, FIELD/LSET/RSET, Statusfunktionen, Dateisystem, MK$/CV
- System: ENVIRON, FRE, CLEAR, TRON/TROFF, STACK, ERDEV, ERR-Anweisung

Altlasten aus Phase 2
- ON ERROR GOTO auf Modulebene ist aus Prozeduren ansprechbar
  (prozeduruebergreifender Fixup im Codegenerator)
- DATA behaelt seinen Rohtext (Gross-/Kleinschreibung, innerer Leerraum)
- Die vier TODO-verify-Zellen der Konvertierungsmatrix sind aufgeloest

Vom Inventar aufgedeckte Fehler
- Zwoelf Non-Features wies der Compiler entgegen der Phase-1-Spec nicht
  ab (CALLS, SSEG, POINT, VIEW, COM, PEN, STRIG, STICK, die
  String*-Routinen, LINE und OPEN "COMn:") -- geschlossen
- Drei Gruppen fehlten im urspruenglichen Umfang: Finanzmathematik,
  Record-Konvertierung, Rest der Dateisystemfunktionen
- bas7advr.hlp allein ist keine vollstaendige Quelle; das Inventar
  bildet die Vereinigung mit qb45advr.hlp

Neue Changes
- phase-3-isam: schliesst Phase 3 ab (Speicherschicht redb)
- phase-3-ortszeit: zieht die UTC-Abweichung zurueck

Neue Abhaengigkeit: unicode-width.
Dokumentiert: sprachreferenz.md und tbvm-design.md sind TODO-frei,
docs/bibliothek.md neu, PLAN.md fortgeschrieben.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-04 06:54:19 +02:00

105 lines
5.4 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 3 (Abschluss) — ISAM-Datenbankunterstützung
## Why
Die Leitplanke „Vollständigkeit ist das Soll" und die Entscheidung vom
2026-09-02 legen fest: ISAM wird implementiert, es ist kein Non-Feature.
Heute existiert davon nur eine Parser-Klausel — `OPEN … FOR ISAM typname
tabellenname AS #n` wird erkannt und auf den „nicht verfügbar"-Marker
abgesenkt. Die eigentlichen ISAM-Anweisungen und -Funktionen
(`CREATEINDEX`, `SETINDEX`, `INSERT`, `RETRIEVE`, `UPDATE`, `DELETE`, die
`MOVE`- und `SEEK`-Familien, die Transaktionsanweisungen) besitzen im
Frontend **keine Signatur**. Sie enden damit in „unbekannter Bezeichner"
bzw. einem generischen Syntaxfehler — genau der Fall, den der Guiding
Principle als Bug definiert: ein dokumentiertes Feature wird still und
ohne Namensnennung abgewiesen.
Die Laufzeitfehler 8189 des ISAM-Bereichs sind bereits als
`tb_runtime::errors` implementiert und warten auf ihre Auslöser.
Dieser Change schließt Phase 3 ab. Der vorausgehende Change
`phase-3-runtime-bildschirm` liefert die Datei-E/A-Grundlage
(Dateitabelle, Recordpuffer, UTF-32-Festtextfelder), auf der ISAM
aufsetzt, sowie das Inventar, in dem die ISAM-Elemente ihren Status
führen.
## What Changes
- **ISAM-Elemente erhalten Frontend-Signaturen**: Sämtliche in der
Original-Hilfe dokumentierten ISAM-Anweisungen und -Funktionen werden
in Grammatik und Signaturprüfung aufgenommen, damit ihre Verwendung
namentlich diagnostiziert statt als unbekannter Bezeichner behandelt
wird. Den maßgeblichen Umfang bestimmt das Sprachinventar aus
`phase-3-runtime-bildschirm`; nach heutigem Stand umfasst er
mindestens `CREATEINDEX`, `DELETEINDEX`, `SETINDEX`, `GETINDEX$`,
`INSERT`, `RETRIEVE`, `UPDATE`, `DELETE`, `DELETETABLE`, `MOVEFIRST`,
`MOVELAST`, `MOVENEXT`, `MOVEPREVIOUS`, `SEEKEQ`, `SEEKGT`, `SEEKGE`,
`BEGINTRANS`, `COMMITTRANS`, `ROLLBACK`/`ROLLBACK ALL`, `SAVEPOINT`
(Funktion), `SETMEM` (Funktion), `BOF` sowie das ISAM-Verhalten von
`EOF`, `DELETE`, `LOF` und `LOC`.
- **ISAM-Datenbanken und Tabellen**: `OPEN … FOR ISAM typname
tabellenname AS #n` bindet eine Tabelle einer Datenbankdatei an eine
Dateinummer; das Satzlayout ergibt sich aus dem benannten
benutzerdefinierten Typ. Tabellen entstehen beim ersten Öffnen,
`DELETETABLE` entfernt sie.
- **Indizes**: benannte Indizes über eine oder mehrere Spalten, eindeutig
oder mehrdeutig, mit auf- und absteigender Ordnung; `SETINDEX` wählt
den aktiven Index und bestimmt damit die Satzreihenfolge, `GETINDEX$`
liefert ihn zurück.
- **Satzoperationen und Cursor**: `INSERT`, `RETRIEVE`, `UPDATE`,
`DELETE` arbeiten auf dem aktuellen Satz; die `MOVE`-Familie bewegt den
Cursor in der Ordnung des aktiven Index, die `SEEK`-Familie positioniert
über Schlüsselvergleiche (gleich, größer, größer-gleich). `EOF` und
`BOF` melden das Überlaufen des Cursors am Ende bzw. am Anfang.
- **Transaktionen**: `BEGINTRANS`, `COMMITTRANS`, `ROLLBACK` und
`ROLLBACK ALL` mit Rücknahme aller Änderungen seit Transaktionsbeginn
bzw. seit einem Sicherungspunkt; `SAVEPOINT` ist eine **Funktion** und
liefert die Kennung des gesetzten Sicherungspunkts.
- **Vergleichsreihenfolge**: Die Sortierordnung der Indizes wird unter
Unicode festgelegt und dokumentiert.
- **ISAM-Fehlersemantik**: Die vorhandenen Fehlercodes 8189 werden von
den entsprechenden Situationen ausgelöst (ungültiger Name, Tabelle
nicht gefunden, Index nicht gefunden, ungültige Spalte, kein aktueller
Satz, Verstoß gegen einen eindeutigen Index, ungültige Operation auf
NULL-Index, inkonsistente Datenbank, zu wenig Puffer).
- **Eigenes Datenbankdateiformat**: Die Datenbankdatei ist bewusst nicht
binärkompatibel zum Vorbild — dieselbe Linie wie bei den UTF-32-
Records. Das Format wird in `docs/dateiformate.md` beschrieben.
**Non-Goals:** Ein Konvertierungswerkzeug für Datenbankdateien des
Vorbilds; die eingebettete SQL-Erweiterung samt `WHILE SELECT`
(Stufe 2, Ideenspeicher); Mehrprozess-Zugriff über
Betriebssystemgrenzen hinweg jenseits der Satzsperren aus `datei-eio`.
## Capabilities
### New Capabilities
- `isam-datenbank`: indizierter Satzzugriff — Datenbank- und
Tabellenbindung an Dateinummern, Indexverwaltung, Cursorbewegung und
Schlüsselsuche, Satzoperationen, Transaktionen, Vergleichsreihenfolge
und die ISAM-Fehlersemantik (Codes 8189).
### Modified Capabilities
- `sprach-frontend`: Die Grammatik und die Signaturprüfung SHALL die
ISAM-Anweisungen und -Funktionen umfassen, sodass ihre Verwendung
namentlich diagnostiziert wird statt als unbekannter Bezeichner.
## Impact
- `crates/tb-frontend`: neue Anweisungsgrammatik und Signaturen für die
ISAM-Elemente; die bisherige `Unsupported`-Absenkung von `OPEN … FOR
ISAM` entfällt.
- `crates/tb-runtime`: neues ISAM-Modul (Speicher, Indizes, Cursor,
Transaktionen) auf der Dateitabelle und den Recordpuffern aus
`phase-3-runtime-bildschirm`.
- `crates/tb-vm`: neue Builtin-Indizes für die ISAM-Anweisungen.
- `tests/compat`: neue Korpusprogramme für Indexordnung, Schlüsselsuche,
Eindeutigkeitsverletzung, Cursorenden und Transaktionsrücknahme.
- `docs/`: `docs/dateiformate.md` um das Datenbankdateiformat erweitert;
`docs/bibliothek.md` um die ISAM-Elemente; `docs/inventar.md` wechselt
deren Status auf `implementiert`; `docs/sprachreferenz.md` hält die
Sortierordnung und die Inkompatibilität des Dateiformats fest.
- PLAN.md: Phase 3 gilt mit diesem Change als abgeschlossen.