Files
TerminalBasic/openspec/changes/phase-3-runtime-bildschirm/specs/sprachinventar/spec.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

3.8 KiB

Purpose

Das Sprachinventar ist das Messinstrument für die Leitplanke „Vollständigkeit ist das Soll": eine gepflegte Liste aller in der Original-Hilfe des Vorbilds dokumentierten Anweisungen, Funktionen und Metabefehle mit Abdeckungsstatus, gegen die sich der Implementierungsstand jederzeit prüfen lässt.

ADDED Requirements

Requirement: Vollständiges Inventar der Original-Hilfe

docs/inventar.md SHALL jede in der Original-Hilfe des Vorbilds dokumentierte Anweisung, Funktion, Metabefehl, Operator-Schlüsselwort und Klausel als eigenen Eintrag führen. Ein dokumentiertes Element MUST NOT fehlen; Vollständigkeit gegenüber der Quelle geht der Kürze vor. Jeder Eintrag SHALL Name, Art (Anweisung/Funktion/Metabefehl), Themengruppe, Status und Fundstelle tragen.

Scenario: Dokumentiertes Element ist erfasst

  • WHEN die Original-Hilfe die Anweisung VIEW PRINT dokumentiert
  • THEN enthält das Inventar einen Eintrag VIEW PRINT mit Art, Gruppe, Status und Fundstelle

Scenario: Non-Feature ist erfasst, nicht weggelassen

  • WHEN PEEK als Non-Feature deklariert ist
  • THEN steht PEEK mit Status Non-Feature im Inventar und die Fundstelle verweist auf den Abschnitt „Abweichungen" der Sprachreferenz

Requirement: Festes Statusvokabular

Der Status eines Eintrags SHALL genau einen von drei Werten tragen: implementiert (Frontend senkt ab und die Laufzeit führt aus), offen (dokumentiert, noch nicht verfügbar) oder Non-Feature (vom Projektinhaber abgelehnt und in der Sprachreferenz unter „Abweichungen" gelistet). Ein Eintrag mit Status Non-Feature MUST eine Fundstelle in der Sprachreferenz nennen.

Scenario: Unzulässiger Status

  • WHEN ein Eintrag den Status teilweise trägt
  • THEN schlägt die Inventarprüfung mit Nennung des Eintrags fehl

Scenario: Non-Feature ohne Fundstelle

  • WHEN ein Eintrag den Status Non-Feature trägt, aber keine Fundstelle nennt
  • THEN schlägt die Inventarprüfung mit Nennung des Eintrags fehl

Requirement: Automatischer Abgleich Inventar gegen Implementierung

Ein automatischer Test SHALL das Inventar gegen den tatsächlichen Implementierungsstand prüfen und bei jeder Divergenz fehlschlagen. Als implementiert markierte Elemente MUST im Frontend eine Signatur besitzen und MUST NOT auf einen „nicht verfügbar"-Marker absenken; als offen markierte Elemente MUST auf einen solchen Marker absenken oder ohne Signatur sein; als Non-Feature markierte Elemente MUST zur Compile-Zeit mit „Feature unavailable" abgewiesen werden. Der Test MUST das divergierende Element, seinen Inventarstatus und den vorgefundenen Zustand benennen.

Scenario: Inventar hinkt der Implementierung hinterher

  • WHEN LOCATE implementiert wurde, im Inventar aber noch offen steht
  • THEN schlägt der Abgleich fehl und nennt LOCATE, Status offen und den Befund „implementiert"

Scenario: Inventar behauptet zu viel

  • WHEN ein Eintrag implementiert trägt, das Element aber weiterhin auf den „nicht verfügbar"-Marker absenkt
  • THEN schlägt der Abgleich fehl und nennt das Element

Scenario: Abdeckungsstand ist abrufbar

  • WHEN der Abgleich läuft
  • THEN nennt er die Zahl der Einträge je Status als Abdeckungsstand

Requirement: Keine stillen Lücken bei dokumentierten Elementen

Ein Element mit Status offen MUST bei Verwendung eine benannte Ablehnung erzeugen — entweder eine Compile-Diagnose oder den Laufzeitfehler für nicht verfügbare Funktionen —, die das Element namentlich nennt. Ein generischer Syntaxfehler oder „unbekannter Bezeichner" für ein dokumentiertes Element MUST NOT auftreten (Guiding Principle).

Scenario: Offenes Element wird namentlich abgewiesen

  • WHEN ein Programm eine im Inventar als offen geführte Anweisung verwendet
  • THEN nennt die Ablehnung den Namen der Anweisung, nicht nur „Syntaxfehler"