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>
16 KiB
16 KiB
1. Vollständigkeits-Inventar
- 1.1 Anweisungs-, Funktions- und Metabefehlsliste aus der Original-Hilfe erheben (dos-help.soulsphere.org, Topic-Listen, README der Professional Edition) und als Rohliste ablegen; verifiziert dadurch, dass die Zahl der erfassten Themen gegen die Topic-Übersicht der Quelle abgeglichen und im Change notiert ist
- 1.2
docs/inventar.mdals Pipe-Tabelle mit den Spalten Name, Art, Gruppe, Status, Fundstelle anlegen und alle Einträge aus 1.1 mit Erststatus füllen; verifiziert dadurch, dass jede Zeile sechs Spalten hat (Name, Art, Gruppe, Status, Fundstelle, Quelle) und das Statusvokabular nurimplementiert/offen/Non-Featureenthält - 1.3 Abgleichstest schreiben, der die Tabelle parst und gegen
builtin_fn,builtin_stmt,banned_featuresowie dieUnsupported-Marker hält; verifiziert dadurch, dass der Test auf dem Ist-Stand grün ist und nach einer künstlich falsch gesetzten Statuszeile mit Nennung des Elements fehlschlägt - 1.4 Prüfung ergänzen, dass
Non-Feature-Einträge eine Fundstelle in docs/sprachreferenz.md nennen und dokumentierteoffen-Elemente namentlich abgewiesen werden (kein generischer Syntaxfehler); verifiziert durch je einen Testfall pro Regel - 1.5 Abdeckungsstand (Anzahl je Status) im Testausgabetext ausweisen; verifiziert dadurch, dass
cargo testdie drei Zahlen nennt - 1.6 Vom Inventar aufgedeckte Abweichung von der Phase-1-Spec schließen: Non-Features, die der Compiler nicht abwies, ergänzen —
CALLS,SSEG,SSEGADD,StringAddress/Assign/Length/Release,POINT,VIEW,COM,PEN,STRIG,STICKinbanned_feature;LINEohneINPUTundOPEN "COMn:"als „Feature unavailable"; verifiziert durchdokumentierte_elemente_werden_namentlich_abgewiesen - 1.7 Signaturen in
builtin_fn/builtin_stmtfür alle bislang signaturlosen Inventarelemente ergänzen (Finanzmathematik,MK…$/CV…,CURDIR$,DIR$,CHDRIVE,LPOS,STACK,SYSTEM,ERDEV/ERDEV$,SetFormatCC); verifiziert durch Frontend-Test über ein Programm, das jedes davon einmal verwendet, ohne Diagnose „unbekannter Bezeichner" - 1.8 Sicherstellen, dass jedes als
offengeführte Element namentlich abgewiesen wird (Diagnose oder Laufzeitfehler nennt den Namen); verifiziert durch Test, dassMKL$()ohne Argument eine Diagnose mit dem NamenMKL$erzeugt
2. Bruchschritt: Puffer, Host, Snapshot-Harness
- 2.1
Cell/TextScreensamt Tests vontb-ui::screennachtb-runtime::screenverschieben, ratatui-Importe entfernen; verifiziert dadurch, dasscargo test -p tb-runtimegrün ist undtb-runtime/Cargo.tomlweiterhin weder ratatui noch crossterm führt - 2.2
tb-runtimeals Abhängigkeit intb-uiaufnehmen;basic_color()undimpl Widgetintb-uibelassen und auf den Runtime-Typ umstellen; verifiziert dadurch, dasscargo run -p tb-ui --example spikeunverändert rendert - 2.3
Host-Trait neu schneiden: Übergabe des Zellenpuffers zur Anzeige, Ereignisabholung (Taste, Größenänderung), Abbruchprüfung; verifiziert dadurch, dasstb-runtimekompiliert und der Trait keine Stream-Methoden mehr trägt - 2.4
ConsoleHostauf Darstellung des Puffers im Terminal und Tastaturereignisse umstellen; verifiziert dadurch, dasstbc run tests/compat/hello.basim Terminal die erwartete Ausgabe zeigt - 2.5
CaptureHostauf Bildschirmzustand plus vorbereitete Tastendrücke umstellen; verifiziert durch einen Unit-Test, der Zeichen und Attribut einer Zelle nachLOCATE/COLOR/PRINTprüft - 2.6 Darstellungsaufrufe an die bestehenden Tick-Grenzen und vor blockierende Eingaben hängen; verifiziert dadurch, dass ein Programm mit Ausgabe vor
INPUTden Text vor der Eingabeaufforderung zeigt - 2.7 Snapshot-Serialisierung schreiben: Textbild getrimmt bis zur letzten belegten Zeile/Spalte, Attributebene nur bei verwendetem
COLOR; verifiziert durch Unit-Tests für getrimmte Ausgabe, signifikante Zeilen-Innenleerzeichen und Weglassen der Attributebene - 2.8 Harness
crates/tb-cli/tests/compat.rsauf Snapshot-Vergleich umstellen, inklusive Fehlermeldung mit Datei, erster abweichender Zeile sowie Zeile/Spalte/Soll/Ist bei Attributabweichung; verifiziert durch je einen absichtlich abweichenden Testfall - 2.9 Die acht bestehenden
.out-Dateien neu erzeugen und jeden Diff einzeln prüfen und begründen; verifiziert dadurch, dassPRINT-only-Programme unverändert bleiben und jede Abweichung im Change begründet notiert ist - 2.10
.gitattributesauf die neuen Snapshot-Dateien prüfen; verifiziert dadurch, dass.out-Dateien weiterhin vor Zeilenenden-Konvertierung geschützt sind
3. Größenunabhängigkeit und Laufzeit-Größenänderung
- 3.1 Alle Bildschirmpfade auf die Abmessungen des Puffers umstellen (
CLS, voreingestellter Scrollbereich, Umbruchspalte, Scrollzeile, Grenzprüfungen vonLOCATEundSCREEN()); verifiziert dadurch, dass eine Suche übertb-runtimeundtb-uikeine Vergleiche gegen die Literale 80 oder 25 außerhalb der Mindestmaß-Prüfung der Darstellungsschicht mehr findet - 3.2 Größenänderungsereignis vom Host bis zum Puffer durchreichen; verifiziert durch Test, dass ein vom Test-Host ausgelöster Wechsel die Abmessungen des Puffers ändert
- 3.3 Anpassung bei Größenänderung: Inhalt oben links erhalten, Cursor klemmen,
VIEW PRINT-Bereich klemmen und bei leerem Ergebnis auf den vollen Bildschirm zurücksetzen; verifiziert durch je einen Unit-Test für Vergrößerung, Verkleinerung und ungültig gewordenen Scrollbereich - 3.4 Test-Host mit explizit gesetzter Bildschirmgröße je Korpusprogramm, ohne stillschweigenden Vorgabewert; verifiziert dadurch, dass ein Korpusprogramm ohne Größenangabe vom Harness abgewiesen wird
- 3.5 Bildschirm-Korpusprogramm bei 80×25 und 120×40 mit je eigener Sollausgabe; verifiziert dadurch, dass sich die Sollausgaben in Umbruch- und Scrollverhalten unterscheiden und beide Läufe grün sind
- 3.6 Korpusprogramm mit Größenänderung während der Ausführung; verifiziert dadurch, dass der Snapshot den erhaltenen Inhalt und die Ausgabe in den neuen Grenzen zeigt
4. Unicode-Doppelzellen
- 4.1
unicode-widthals Abhängigkeit aufnehmen und Zellenmodell um Fortsetzungszellen erweitern; verifiziert durch Unit-Test, dass ein CJK-Zeichen an Spalte 1 die Spalte 2 als Fortsetzung belegt - 4.2 Cursorfortschritt,
POSund Umbruch am rechten Rand auf Darstellungsbreite umstellen; verifiziert durch Unit-Tests für Vorrücken um zwei Spalten und vollständigen Umbruch bei belegter letzter Spalte - 4.3 Überschreiben einer Zellenhälfte leert die andere; verifiziert durch Unit-Test, dass keine Geisterzeichen zurückbleiben
- 4.4
LOCATEauf eine Fortsetzungszelle auf den Zeichenanfang abbilden; verifiziert durch Unit-Test - 4.5 Korpusprogramm mit CJK und Emoji inklusive Randumbruch ergänzen; verifiziert dadurch, dass der Snapshot der dokumentierten Sollausgabe entspricht
- 4.6 Abweichung in docs/sprachreferenz.md festhalten; verifiziert durch den Abschnittseintrag
5. Bildschirmanweisungen und -funktionen
- 5.1
CLS(inkl.CLS 2),COLORmit ausgelassenen Argumenten,LOCATEmit ausgelassenen Argumenten und Fehler 5 bei Grenzüberschreitung; verifiziert durch Korpustest mit Snapshot und je einem Fehlerfall - 5.2
WIDTH,VIEW PRINT(setzen und zurücksetzen), Scrollen im begrenzten Bereich; verifiziert durch Korpustest, dass Zeilen außerhalb des Bereichs unverändert bleiben - 5.3
CSRLIN,POS(0)und die FunktionsformSCREEN(zeile, spalte [, farbe])inklusive Fehler 5 außerhalb des Bildschirms; verifiziert durch Korpustest mit Zurücklesen eines geschriebenen Zeichens - 5.4 Anweisungsform
SCREENentgegennehmen und dokumentiertes Verhalten festlegen; verifiziert dadurch, dass keineUnsupported-Absenkung mehr erfolgt und das Verhalten in der Sprachreferenz steht - 5.5
INKEY$nicht blockierend (leerer String, Zeichen, Sondertaste als zwei Zeichen mit führendem Nullzeichen); verifiziert durch Test mit vorbereiteten Tastendrücken im Capture-Host - 5.6
INPUT$(n)blockierend ohne Echo; verifiziert durch Test, dass genaunZeichen gelesen werden und der Bildschirm unverändert bleibt - 5.7
TABundSPCin derPRINT-Familie; verifiziert durch Korpustest mit Spaltenpositionen - 5.8
KEY-Umfang (KEY LIST/ON/OFF, Funktionstasten-Makros) aus der Original-Hilfe klären, umsetzen und in docs/sprachreferenz.md festhalten; verifiziert durch Korpustest und Dokumentationsabschnitt
6. String-, Zahlen- und Formatbibliothek
- 6.1 Alle im Inventar geführten Stringfunktionen vervollständigen inklusive Randfälle (
VAL-Präfix,STR$-Leerzeichen, Fehler 5 bei Startposition < 1, Länge über Stringende); verifiziert durch Korpustest je Randfall - 6.2
PRINT USING/LPRINT USING/FORMAT$mit numerischen Platzhaltern, Tausendertrennung, Vorzeichenführung,$$/**/**$, Exponentialform und String-Platzhaltern; verifiziert durch Korpustest je Formatzeichenklasse - 6.3 Feldüberlauf mit
%-Präfix umsetzen und in docs/sprachreferenz.md festhalten; verifiziert durch Korpustest und Dokumentationsabschnitt - 6.4 Wiederverwendung der Formatzeichenkette bei mehreren Werten; verifiziert durch Korpustest
- 6.5 Mathematikfunktionen vervollständigen inklusive Banker's Rounding, Fehler 6 bei Überlauf, Fehler 5 bei
SQR/LOG, Fehler 11 bei Division durch null; verifiziert durch Korpustest je Fehlerfall - 6.6 Kompatiblen
RND/RANDOMIZE-PRNG umsetzen (RND(0)wiederholt, negatives Argument setzt Startwert) und den Algorithmus dokumentieren; verifiziert durch Korpustest mit reproduzierbarer Folge nachRANDOMIZE 42 - 6.7 Datums- und Zeitfunktionen inklusive Serienwert-Zählweise,
WEEKDAY= 1 für Sonntag und Fehler 5 bei ungültigen Angaben; verifiziert durch Korpustest mit festem Datum - 6.8
DATE$/TIME$als Anweisung; verifiziert durch Test, dass die Funktionsform danach den gesetzten Wert liefert - 6.9 Finanzmathematische Funktionen
FV#,PV#,Pmt#,IPmt#,PPmt#,NPer#,Rate#,NPV#,IRR#,MIRR#,SLN#,SYD#,DDB#in DOUBLE mit Fälligkeitsargument; verifiziert durch Korpustest je Funktion gegen dokumentierte Sollwerte - 6.10 Fehler 5 bei ungültigen Argumenten der Finanzfunktionen und bei erfolgloser Näherung von
Rate#/IRR#; verifiziert durch Korpustest je Fall - 6.11 Abbruchbedingung der Näherung in docs/bibliothek.md dokumentieren; verifiziert durch den Abschnittseintrag
- 6.12
SetFormatCCfür Währungszeichen und -stellung von$$; verifiziert durch Korpustest, dassPRINT USING "$$#.##"das gesetzte Zeichen verwendet - 6.13
docs/bibliothek.mdanlegen und mit dem umgesetzten Stand füllen; verifiziert dadurch, dass jede in Gruppe 6 umgesetzte Funktion dort einen Eintrag hat
7. Datei-E/A
- 7.1 Dateitabelle und
OPENin beiden Syntaxen für sequenziell,RANDOMundBINARY,CLOSE(mit und ohne Argument),RESET,FREEFILE; verifiziert durch Korpustest inklusive Fehler 55, 52 und 53 - 7.2 Sequenzielle Übertragung:
PRINT #,WRITE #,INPUT #,LINE INPUT #,EOF, Fehler 62 beim Lesen über das Dateiende; verifiziert durch Korpustest, dassWRITE #undINPUT #gegenläufig sind - 7.3 Recordpuffer mit
FIELD,LSET,RSETinklusive Abschneiden überlanger Werte; verifiziert durch Korpustest - 7.4 Festtextfelder als UTF-32 mit konstanter Recordlänge; verifiziert durch Korpustest, dass ein Record mit ASCII und einer mit Nicht-ASCII dieselbe Byteanzahl belegen
- 7.5
GET/PUTfürRANDOMmit Recordnummer und mit UDT-Variablen; verifiziert durch Korpustest mit Schreiben und Lesen an Position 3 - 7.6 Binärzugriff mit byteweiser Positionierung,
SEEKals Anweisung und Funktion; verifiziert durch Korpustest, dass ein positioniert überschriebenes Byte zurückgelesen wird und die Nachbarbytes unverändert bleiben - 7.7
LOF,LOC,FILEATTRinklusive Fehler 52 auf geschlossener Datei; verifiziert durch Korpustest - 7.8
LOCK/UNLOCKumsetzen; verifiziert durch Korpustest für Sperren und Freigeben, plattformbedingte Abweichungen in docs/sprachreferenz.md notiert - 7.9 Dateisystem-Anweisungen
KILL,NAME … AS,FILES,CHDIR,MKDIR,RMDIR,SHELLmit plattformübergreifender Pfadsemantik (\und/, Laufwerksbuchstaben) inklusive Fehler 53 und 76; verifiziert durch Korpustest mit Rückwärts-Schrägstrich - 7.10
LPRINT/LPRINT USINGmit dokumentiertem Ausgabeziel sowieLPOS; verifiziert durch Test, dass die FormatierungPRINTentspricht,LPOSdie Druckerspalte liefert, und durch den Abschnitt in der Sprachreferenz - 7.11 Record-Konvertierungsfunktionen
MKI$/MKL$/MKS$/MKD$/MKC$undCVI/CVL/CVS/CVD/CVC; verifiziert durch Korpustest, dass jedes Paar gegenläufig ist und falsche Argumentlänge Fehler 5 auslöst - 7.12 MBF-Varianten
MKSMBF$/MKDMBF$/CVSMBF/CVDMBFumsetzen oder als Non-Feature namentlich abweisen und in docs/sprachreferenz.md listen; verifiziert durch Korpustest bzw. den Abschnittseintrag - 7.13
CURDIR$,DIR$(erster und Folgetreffer, leerer String am Ende),CHDRIVEundSHELLals Funktion; verifiziert durch Korpustest, der ein Verzeichnis mitDIR$vollständig durchläuft - 7.14 Korpus-Dateiprogramme in einem temporären Arbeitsverzeichnis ausführen; verifiziert dadurch, dass nach
cargo testgit statussauber ist
8. System- und Umgebungsanweisungen
- 8.1
ENVIRON$(nach Name und Position),ENVIRON,COMMAND$; verifiziert durch Korpustest inklusive leerem String für unbekannte Namen - 8.2
FRE,CLEAR,TRON,TROFFmit definiertem, dokumentiertem Verhalten; verifiziert dadurch, dass keineUnsupported-Absenkung mehr erfolgt und der Ersatzwert fürFREin der Sprachreferenz steht - 8.3
STACKals Anweisung und Funktion,SYSTEM,ERDEV/ERDEV$mit definierten Ersatzwerten; verifiziert durch Korpustest, dassSYSTEMmit demselben Status endet wieEND, und durch die Ersatzwert-Einträge in docs/sprachreferenz.md
9. Altlasten aus Phase 2
- 9.1
ON ERROR GOTOauf Modulebene aus Prozeduren auflösbar machen (sema.rs,lower_stmt/OnError),ON LOCAL ERRORbleibt prozedurlokal; verifiziert durch je einen Frontend-Test für beide Fälle - 9.2 DATA-Rohtext im Lexer erhalten (keine Bezeichner-Normalisierung, Randleerraum entfernt, Innenleerraum erhalten); verifiziert durch Korpustest mit gemischter Schreibweise
- 9.3
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); verifiziert dadurch, dass keineTODO verify-Zelle mehr im Dokument steht - 9.4 Korpustest
konvertierung.basum die in 9.3 geklärten Randfälle schärfen; verifiziert durch die erweiterte Sollausgabe
10. Abschluss
- 10.1 Inventarstatus für alle in diesem Change umgesetzten Elemente auf
implementiertsetzen; verifiziert dadurch, dass der Abgleichstest aus 1.3 grün bleibt - 10.2 docs/sprachreferenz.md fortschreiben (Doppelzellen,
KEY n,PRINT USING-Überlauf, UTF-32-Records, plattformbedingte Abweichungen); verifiziert durch die vorhandenen Abschnitte - 10.3 Vollständige Suite ausführen; verifiziert dadurch, dass
cargo test --workspacegrün ist. Nur macOS geprüft — Windows und Linux stehen aus und gehören zu den Plattformtests in Phase 6 (PLAN.md); die Laufzeit enthält keinen plattformspezifischen Code außer der Pfadnormierung undSHELL. - 10.4 Meilenstein prüfen: klassische Konsolenprogramme des Korpus laufen unverändert; verifiziert dadurch, dass jedes Korpusprogramm ohne Laufzeitfehler 73 durchläuft
- 10.5 PLAN.md Phase 3 abhaken, soweit dieser Change reicht, und den offenen ISAM-Teil auf
phase-3-isamverweisen; verifiziert durch den aktualisierten Planabschnitt