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>
8.0 KiB
8.0 KiB
1. Umfang festlegen
- 1.1 ISAM-Abschnitt der Original-Hilfe auswerten und alle Anweisungen, Funktionen und Klauseln gegen die ISAM-Einträge in
docs/inventar.mdabgleichen; verifiziert dadurch, dass jedes gefundene Element im Inventar mit Statusoffensteht und im Change notiert ist, falls es über die Aufzählung im Proposal hinausgeht - 1.2 Argumentformen je Element aus der Original-Hilfe festhalten (insbesondere die Schreibweise der Spaltenliste bei
CREATEINDEX); verifiziert durch die Notiz im Change, die jede Signatur mit ihrer Quelle nennt
2. Frontend: Grammatik und Signaturen
- 2.1 ISAM-Anweisungen in die Parser-Grammatik aufnehmen; verifiziert durch Frontend-Test, dass
SETINDEX #1, "Name"diagnose-frei parst - 2.2 Signaturen (Argumentanzahl und -typen) für alle ISAM-Elemente in der Semantik führen; verifiziert durch Frontend-Test, dass
SEEKGT #1ohne Schlüsselwert eine Diagnose erzeugt, dieSEEKGTnamentlich nennt - 2.3 Satzargumente gegen den Tabellentyp prüfen; verifiziert durch Frontend-Test, dass
RETRIEVE #1, x$„Type mismatch" meldet - 2.4
Unsupported-Absenkung vonOPEN … FOR ISAMentfernen und durch die reguläre Absenkung ersetzen; verifiziert dadurch, dass ein ISAM-Programm nicht mehr mit Laufzeitfehler 73 endet - 2.5 Prüfen, dass kein ISAM-Element mehr als unbekannter Bezeichner behandelt wird; verifiziert durch Frontend-Test über ein Programm, das jedes Element einmal verwendet, ohne Diagnose „unbekannter Bezeichner"
3. Speicherschicht
- 3.1
redbals Abhängigkeit aufnehmen, auf das ISAM-Modul intb-runtimebeschränkt; verifiziert dadurch, dasscargo build -p tb-runtimedurchläuft - 3.2 Datenbankdatei mit Formatversion anlegen und öffnen; verifiziert durch Test, dass eine Datei mit höherer Formatversion mit benanntem Fehler abgewiesen und eine strukturell beschädigte Datei mit Laufzeitfehler 88 abgelehnt wird
- 3.3 Satztabelle
satz-id → Satzbytesmit monoton vergebenen, nie wiederverwendeten IDs; verifiziert durch Test, dass eine nachDELETEneu vergebene ID nicht vorkommt - 3.4 Satzserialisierung auf den Recordpuffern und der UTF-32-Festtextkodierung aus
datei-eioaufsetzen; verifiziert durch Roundtrip-Test über alle Feldtypen des Satztyps - 3.5 Ordnungserhaltende Schlüsselkodierung je Spaltentyp (Zahlen vorzeichenrichtig fester Breite, Text nach Codepoints, mehrspaltig verkettet mit eindeutigem Trenner, absteigend durch Byte-Invertierung); verifiziert durch Eigenschaftstest über zufällige Wertepaare, dass der Byte-Vergleich der Kodierung dem fachlichen Vergleich entspricht
- 3.6 Sortierordnung (Unicode-Codepoints, Groß-/Kleinschreibung unterschieden) in docs/sprachreferenz.md festhalten; verifiziert durch den Abschnittseintrag
- 3.7 Datenbankdateiformat in docs/dateiformate.md beschreiben inklusive Formatversion und bewusster Inkompatibilität zum Vorbild; verifiziert durch den Abschnittseintrag
4. Tabellen
- 4.1
OPEN … FOR ISAM typname tabellenname AS #nan die Dateitabelle binden, Satzlayout aus dem benannten Typ ableiten; verifiziert durch Korpustest, dass die Dateinummer danach nutzbar ist - 4.2 Tabelle beim ersten Öffnen anlegen; verifiziert durch Korpustest gegen eine Datenbank ohne diese Tabelle
- 4.3 Layoutabgleich bei bestehender Tabelle mit Fehler 88 bei Abweichung; verifiziert durch Korpustest mit unpassendem Typ
- 4.4 Ungültige Datenbank- und Tabellennamen mit Fehler 81 abweisen; verifiziert durch Korpustest
- 4.5
CLOSElöst die Bindung und schreibt ausstehende Änderungen fest; verifiziert durch Korpustest, dass die Sätze nach erneutem Öffnen vorhanden sind - 4.6
DELETETABLEentfernt Tabelle samt Indizes, Fehler 82 bei fehlender Tabelle; verifiziert durch Korpustest für beide Fälle
5. Indizes
- 5.1 Indextabellen
Schlüsselbytes → satz-idje Index anlegen; verifiziert durch Test, dass die Einträge in Schlüsselreihenfolge stehen - 5.2
CREATEINDEXmit einer und mit mehreren Spalten, eindeutig und mehrdeutig, auf- und absteigend; verifiziert durch Korpustest je Variante - 5.3
DELETEINDEX; verifiziert durch Korpustest, dass der Index danach nicht mehr gesetzt werden kann - 5.4
SETINDEXsetzt den aktiven Index und den Cursor auf unpositioniert,GETINDEX$liefert ihn zurück; verifiziert durch Korpustest - 5.5 Fehler 83 bei unbekanntem Index und Fehler 84 bei unbekannter Spalte; verifiziert durch Korpustest für beide Fälle
6. Cursor
- 6.1 Cursor je Dateinummer als Wert führen (aktiver Index, letzte Satz-ID, Kennzeichen unpositioniert); verifiziert durch Unit-Test, dass der Cursor eine Satzänderung überlebt
- 6.2
MOVEFIRST,MOVELAST,MOVENEXT,MOVEPREVIOUSin der Ordnung des aktiven Index; verifiziert durch Korpustest, dass ein Durchlauf die Sätze in Indexreihenfolge liefert - 6.3 Bewegung ohne aktiven Index folgt der Einfügereihenfolge; verifiziert durch Korpustest
- 6.4
EOFam Ende undBOFam Anfang, Cursor danach jeweils unpositioniert; verifiziert durch je einen Korpustest fürMOVENEXTam Ende undMOVEPREVIOUSam Anfang - 6.5
SEEKEQ,SEEKGT,SEEKGEinklusive Präfixsuche über einen mehrspaltigen Index; verifiziert durch Korpustest mit den Schlüsseln 10, 20, 30 und einer Präfixsuche - 6.6 Erfolglose Suche setzt
EOFund lässt den Cursor unpositioniert; verifiziert durch Korpustest - 6.7 Suche ohne aktiven Index löst Fehler 83 aus; verifiziert durch Korpustest
7. Satzoperationen
- 7.1
INSERTundRETRIEVE; verifiziert durch Korpustest, dass ein eingefügter Satz perSEEKEQgefunden und feldgleich gelesen wird - 7.2
UPDATEundDELETE, Cursor nachDELETEunpositioniert; verifiziert durch Korpustest - 7.3 Fehler 85 bei
RETRIEVE/UPDATE/DELETEohne positionierten Cursor; verifiziert durch je einen Korpustest - 7.4 Eindeutigkeitsprüfung mit Fehler 86 und unverändertem Satzbestand; verifiziert durch Korpustest, der nach dem Fehler den Bestand nachzählt
- 7.5 Alle Indizes nach jeder Satzoperation nachführen; verifiziert durch Korpustest, dass ein Satz nach Änderung der indizierten Spalte an neuer Position im Durchlauf erscheint
8. Transaktionen
- 8.1
BEGINTRANS/COMMITTRANSauf einer Schreibtransaktion; verifiziert durch Korpustest, dass die Änderungen nach erneutem Öffnen vorhanden sind - 8.2 Rücknahmeprotokoll der Änderungen innerhalb einer Transaktion; verifiziert durch Unit-Test, dass jede Satzoperation einen Protokolleintrag erzeugt
- 8.3
ROLLBACK ALLstellt Sätze und Indizes wieder her, beendet die Transaktion und setzt den Cursor auf unpositioniert; verifiziert durch Korpustest mit Einfügen, Löschen und anschließendem Durchlauf - 8.4
SAVEPOINTals Funktion (liefert Kennung) undROLLBACK kennung; verifiziert durch Korpustest, dass Änderungen vor dem Punkt erhalten bleiben
9. Übrige Elemente
- 9.2
SETMEMals Funktion mit echter Puffergrenze und Fehler 89 beim Überschreiten; verifiziert durch Korpustest, der die Grenze niedrig setzt und den Fehler auslöst - 9.3 Vorgabewert und Bedeutung von
SETMEMsowie die Abweichung vom DOS-Speichermodell in docs/sprachreferenz.md festhalten; verifiziert durch den Abschnittseintrag - 9.4 Indexordnung gegen den Stringvergleich des Dialekts prüfen; verifiziert durch Korpustest, dass Indexreihenfolge und
<-Vergleich übereinstimmen
10. Abschluss
- 10.1 ISAM-Einträge in
docs/inventar.mdaufimplementiertsetzen; verifiziert dadurch, dass der Abgleichstest ausphase-3-runtime-bildschirmgrün bleibt - 10.2
docs/bibliothek.mdum die ISAM-Elemente erweitern; verifiziert dadurch, dass jedes umgesetzte Element dort einen Eintrag hat - 10.3 Korpus-ISAM-Programme in einem temporären Arbeitsverzeichnis ausführen; verifiziert dadurch, dass nach
cargo testgit statussauber ist - 10.4 Vollständige Suite auf allen Zielplattformen ausführen; verifiziert dadurch, dass
cargo test --workspacegrün ist - 10.5 PLAN.md Phase 3 als abgeschlossen markieren; verifiziert durch den aktualisierten Planabschnitt