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>
2.8 KiB
ADDED Requirements
Requirement: Zeitfunktionen liefern Ortszeit
DATE$, TIME$, TIMER und NOW SHALL den Zeitpunkt in der Zeitzone
des Rechners liefern, nicht in koordinierter Weltzeit. TIMER SHALL die
Sekunden seit der lokalen Mitternacht zählen. Der maßgebliche Versatz
SHALL für den jeweils abgefragten Zeitpunkt bestimmt werden, nicht einmal
beim Programmstart — ein Programm, das über eine Zeitumstellung hinweg
läuft, folgt ihr. Die Zerlegungsfunktionen (DAY, MONTH, YEAR,
WEEKDAY, HOUR, MINUTE, SECOND) arbeiten unverändert auf seriellen
Werten und rechnen selbst nicht um.
Scenario: Datum und Uhrzeit stimmen mit der Systemuhr überein
- WHEN ein Programm
DATE$undTIME$abfragt - THEN entsprechen sie der Ortszeit des Rechners zum Abfragezeitpunkt
Scenario: TIMER zählt ab lokaler Mitternacht
- WHEN
TIMERabgefragt wird - THEN entspricht der Wert den Sekunden seit der letzten lokalen Mitternacht, nicht seit der UTC-Mitternacht
Scenario: NOW und die Zerlegungsfunktionen passen zusammen
- WHEN
n# = NOWgebildet undHOUR(n#)ausgewertet wird - THEN liefert
HOUR(n#)dieselbe Stunde, die auchTIME$nennt
Scenario: Sommerzeit wirkt zum jeweiligen Zeitpunkt
- WHEN in einer Zone mit Sommerzeit ein Zeitpunkt vor und einer nach der Umstellung abgefragt wird
- THEN unterscheiden sich die beiden Versätze um die Umstellungsspanne
Requirement: Zonenermittlung mit Rückfallebene
Die Laufzeit SHALL die Zeitzone des Rechners über die Betriebssystemeinstellung bestimmen. Lässt sie sich nicht ermitteln, SHALL UTC gelten und das Programm ohne Fehler weiterlaufen. Ob die Rückfallebene greift, MUST für ein Programm erkennbar sein und in docs/sprachreferenz.md beschrieben stehen; ein stiller Wechsel auf UTC MUST NOT vorkommen.
Scenario: Zone nicht ermittelbar
- WHEN die Zeitzone des Rechners nicht bestimmt werden kann
- THEN rechnen die Zeitfunktionen in UTC und das Programm läuft ohne Fehler weiter
Scenario: Rückfallebene ist erkennbar
- WHEN ein Programm den Zonenzustand abfragt
- THEN unterscheidet die Antwort erkennbar zwischen ermittelter Zone und Rückfall auf UTC
Requirement: Programmversatz wirkt auf die Ortszeit
DATE$ = text$ und TIME$ = text$ SHALL weiterhin nicht die Systemuhr
stellen, sondern einen programmeigenen Versatz setzen. Dieser Versatz
SHALL auf die Ortszeit wirken: nach TIME$ = "10:20:30" nennt
TIME$ diese Uhrzeit, und NOW, HOUR und TIMER stimmen damit
überein.
Scenario: Gesetzte Uhrzeit wird zurückgelesen
- WHEN
TIME$ = "10:20:30"ausgeführt und danachTIME$abgefragt wird - THEN nennt
TIME$10:20:30
Scenario: Versatz wirkt auf alle Zeitfunktionen
- WHEN
DATE$ = "01-02-1993"gesetzt und danachYEAR(NOW)ausgewertet wird - THEN liefert
YEAR(NOW)1993