Setzt den OpenSpec-Change phase-3-ortszeit um (21/21 Aufgaben) und zieht
damit die in Phase 3 eingegangene Abweichung zurueck: DATE$, TIME$, TIMER
und NOW rechnen in der Zeitzone des Rechners, TIMER zaehlt ab der lokalen
Mitternacht.
Versatzermittlung
- jiff 0.2.35 als Abhaengigkeit von tb-runtime
- datetime::utc_versatz(zeitpunkt) ist der einzige Aufrufpunkt der
Bibliothek; die Kalenderrechnung darunter bleibt Eigenimplementierung
und sieht sie nie -- zwei Kalendermodelle nebeneinander waeren eine
dauerhafte Fehlerquelle
- Der Versatz gilt je Zeitpunkt, nicht je Programmlauf: ein Programm, das
ueber eine Zeitumstellung hinweg laeuft, folgt ihr
Zonenzustand
- Zeitzone { System, Fest(i32), Unbekannt } im RtState
- Fest(n) macht Tests und Korpusprogramme unabhaengig von der Zone des
Testrechners; TZ waere prozessweit und set_var seit Rust 2024 unsafe
Rueckfallebene
- Ohne ermittelbare Zone gilt UTC, das Programm laeuft weiter
- tbc run meldet den Rueckfall einmal beim Start auf der Fehlerausgabe,
nicht je Abfrage -- ein stiller Wechsel waere ein Verstoss gegen den
Guiding Principle
Korpus
- Neue Direktive ' tb-tz: +-HH:MM im Harness
- zeitzone.bas prueft Ortszeit, TIMER ab lokaler Mitternacht und den
Programmversatz gegen eine gesetzte Uhrzeit
- datumzeit.bas auf die Direktive umgestellt; Sollausgabe unveraendert
Nebenbefund
- TIMER trennt jetzt ganze Sekunden (Ortszeit) vom Bruchteil
(Systemuhr). Ohne die Trennung waere TIMER in Zonen mit halbstuendigem
Versatz gesprungen.
Dokumentation: die Abweichung "Uhr laeuft in UTC" entfaellt aus
sprachreferenz.md; bibliothek.md und PLAN.md nachgezogen, jiff steht im
Stufe-2-Ideenspeicher neben crossterm.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
8.8 KiB
Bibliotheksreferenz
Die Laufzeitbibliothek so wie implementiert. Der Umfang wird von docs/inventar.md bestimmt; dort steht auch, was noch offen ist. Abweichungen vom Vorbild sind in docs/sprachreferenz.md unter „Abweichungen" gesammelt.
Ein automatischer Test hält das Inventar gegen den Code; diese Referenz beschreibt das Verhalten dahinter.
Bildschirm
| Element | Art |
|---|---|
CLS |
Anweisung |
COLOR |
Anweisung |
CSRLIN |
Funktion |
INPUT |
Anweisung |
LINE INPUT |
Anweisung |
LOCATE |
Anweisung |
POS |
Funktion |
PRINT |
Anweisung |
SCREEN |
Anweisung |
SCREEN |
Funktion |
SPC |
Funktion |
TAB |
Funktion |
VIEW PRINT |
Anweisung |
WIDTH |
Anweisung |
Alle Anweisungen wirken auf den Zellenpuffer der aktuellen
Bildschirmgröße — 80×25 ist nirgends eine feste Grenze. Ausgelassene
Argumente von LOCATE und COLOR lassen den bisherigen Wert stehen.
LOCATE außerhalb der Grenzen und SCREEN(zeile, spalte) außerhalb
lösen Fehler 5 aus. Die Funktionsform SCREEN liefert ohne drittes
Argument den Zeichencode, mit drittem das Farbattribut
(Hintergrund·16 + Vordergrund). WIDTH hebt den Puffer höchstens an.
VIEW PRINT ohne Argumente setzt den Scrollbereich auf den vollen
Bildschirm zurück.
Datum/Zeit
| Element | Art |
|---|---|
DATE$ |
Anweisung |
DATE$ |
Funktion |
DATESERIAL |
Funktion |
DATEVALUE |
Funktion |
DAY |
Funktion |
HOUR |
Funktion |
MINUTE |
Funktion |
MONTH |
Funktion |
NOW |
Funktion |
SECOND |
Funktion |
TIME$ |
Anweisung |
TIME$ |
Funktion |
TIMER |
Funktion |
TIMESERIAL |
Funktion |
TIMEVALUE |
Funktion |
WEEKDAY |
Funktion |
YEAR |
Funktion |
Serielle Werte zählen Tage ab dem 30.12.1899 (Serie 2 = 1.1.1900);
der Nachkommaanteil ist die Tageszeit. WEEKDAY liefert 1 für Sonntag.
Ungültige Datums- oder Zeitangaben lösen Fehler 5 aus.
Die Uhr rechnet in der Ortszeit des Rechners; TIMER zählt ab der
lokalen Mitternacht. Der Versatz wird für den jeweils abgefragten
Zeitpunkt bestimmt, nicht einmal beim Programmstart — ein Programm, das
über eine Zeitumstellung hinweg läuft, folgt ihr.
Lässt sich die Zone nicht ermitteln, gilt UTC; das Programm läuft weiter und der Runner meldet es einmal beim Start auf der Fehlerausgabe.
DATE$ = … und TIME$ = … stellen nicht die Systemuhr, sondern einen
programmeigenen Versatz auf die Ortszeit, den alle Zeitfunktionen
mitrechnen. DATEVALUE und TIMEVALUE lesen Wanduhrzeit und rechnen
nicht um.
Deklaration
| Element | Art |
|---|---|
COMMON |
Anweisung |
CONST |
Anweisung |
DATA |
Anweisung |
DEFtype |
Anweisung |
DIM |
Anweisung |
ERASE |
Anweisung |
LBOUND |
Funktion |
LET |
Anweisung |
OPTION BASE |
Anweisung |
READ |
Anweisung |
REDIM |
Anweisung |
REM |
Anweisung |
RESTORE |
Anweisung |
SHARED |
Anweisung |
STATIC |
Anweisung |
SWAP |
Anweisung |
TYPE |
Anweisung |
UBOUND |
Funktion |
Ereignisse
| Element | Art |
|---|---|
DOEVENTS |
Funktion |
Fehlerbehandlung
| Element | Art |
|---|---|
ERL |
Funktion |
ERR |
Funktion |
ERROR |
Anweisung |
ON ERROR |
Anweisung |
RESUME |
Anweisung |
Finanzen
| Element | Art |
|---|---|
DDB# |
Funktion |
FV# |
Funktion |
IPMT# |
Funktion |
IRR# |
Funktion |
MIRR# |
Funktion |
NPER# |
Funktion |
NPV# |
Funktion |
PMT# |
Funktion |
PPMT# |
Funktion |
PV# |
Funktion |
RATE# |
Funktion |
SLN# |
Funktion |
SYD# |
Funktion |
Alle Funktionen rechnen in DOUBLE. Vorzeichenkonvention wie beim Vorbild: ausgehende Zahlungen sind negativ, eingehende positiv. Das letzte Argument der Renten-Funktionen ist die Fälligkeit — 0 nachschüssig, 1 vorschüssig.
Rate# und IRR# nähern sich mit dem Sekantenverfahren.
Abbruchbedingung: höchstens 100 Schritte; erreicht wird die Lösung,
wenn der Betrag der Restabweichung unter 1e-9 fällt. Bleibt sie über
1e-6, gilt die Näherung als erfolglos und es tritt Fehler 5 auf —
ein stiller Ersatzwert wird nie geliefert. Eine Zahlungsreihe ohne
Vorzeichenwechsel weist IRR# sofort mit Fehler 5 ab.
Weitere Fehler 5: Periode außerhalb der Laufzeit bei
IPmt#/PPmt#/SYD#/DDB#, Nutzungsdauer null bei SLN#,
Perioden null bei Pmt#, Zinssatz ≤ −1.
Formatierung
| Element | Art |
|---|---|
FORMAT$ |
Funktion |
PRINT USING |
Anweisung |
SetFormatCC |
Routine |
PRINT USING, LPRINT USING und FORMAT$ teilen dieselbe
Formatzeichenkette. Numerische Platzhalter: # Ziffernstelle,
. Dezimalpunkt, , Tausendertrennung, +/- Vorzeichenführung
(vorn oder hinten, mit eigener Stelle), $$ mitlaufendes
Währungszeichen und ** Sternfüllung (beide bringen zwei Stellen
mit), ^^^^ Exponentialform. String-Platzhalter: ! erstes Zeichen,
& ganzer String, \ \ feste Länge. _ macht das Folgezeichen
literal.
Passt ein Wert nicht in sein Feld, wird er vollständig ausgegeben und
mit % gekennzeichnet. Die Formatzeichenkette wird wiederholt,
solange Werte übrig sind. Eine Zeichenkette ohne Feld bei vorhandenen
Werten löst Fehler 5 aus. SetFormatCC setzt das Währungszeichen
über einen Ländercode; nicht aufgeführte Codes behalten $.
Klang
| Element | Art |
|---|---|
BEEP |
Anweisung |
Mathematik
| Element | Art |
|---|---|
ABS |
Funktion |
ATN |
Funktion |
CCUR |
Funktion |
CDBL |
Funktion |
CINT |
Funktion |
CLNG |
Funktion |
COS |
Funktion |
CSNG |
Funktion |
EXP |
Funktion |
FIX |
Funktion |
INT |
Funktion |
LOG |
Funktion |
RANDOMIZE |
Anweisung |
RND |
Funktion |
SGN |
Funktion |
SIN |
Funktion |
SQR |
Funktion |
TAN |
Funktion |
Rundung ist kaufmännisch-symmetrisch zur geraden Zahl
(CINT(0.5) = 0, CINT(1.5) = 2, CINT(2.5) = 2). INT rundet ab,
FIX in Richtung null. Überschreitet ein Ergebnis den Zieltyp, tritt
Fehler 6 auf; SQR/LOG mit unzulässigem Argument lösen Fehler 5
aus, Division durch null Fehler 11.
Der Zufallsgenerator ist der 24-Bit-LCG des Vorbilds
(zustand = (zustand · &HFD43FD + &HC39EC3) MOD 2^24). RND(0)
wiederholt den letzten Wert, RND(n) mit n < 0 sät neu aus dem
Argument. RANDOMIZE saat liefert bei gleicher Saat stets dieselbe
Folge, unabhängig von vorherigen RND-Aufrufen; ohne Argument wird
der Startwert abgefragt.
Metabefehl
| Element | Art |
|---|---|
$DYNAMIC |
Metabefehl |
$STATIC |
Metabefehl |
Prozeduren
| Element | Art |
|---|---|
CALL |
Anweisung |
DECLARE |
Anweisung |
DEF FN |
Anweisung |
FUNCTION |
Anweisung |
SUB |
Anweisung |
Steuerfluss
| Element | Art |
|---|---|
DO...LOOP |
Anweisung |
END |
Anweisung |
EXIT |
Anweisung |
FOR...NEXT |
Anweisung |
GOSUB |
Anweisung |
GOTO |
Anweisung |
IF...THEN...ELSE |
Anweisung |
ON...GOSUB |
Anweisung |
ON...GOTO |
Anweisung |
RETURN |
Anweisung |
SELECT CASE |
Anweisung |
STOP |
Anweisung |
WHILE...WEND |
Anweisung |
Strings
| Element | Art |
|---|---|
ASC |
Funktion |
CHR$ |
Funktion |
HEX$ |
Funktion |
INSTR |
Funktion |
LCASE$ |
Funktion |
LEFT$ |
Funktion |
LEN |
Funktion |
LTRIM$ |
Funktion |
MID$ |
Anweisung |
MID$ |
Funktion |
OCT$ |
Funktion |
RIGHT$ |
Funktion |
RTRIM$ |
Funktion |
SPACE$ |
Funktion |
STR$ |
Funktion |
STRING$ |
Funktion |
UCASE$ |
Funktion |
VAL |
Funktion |
Zeichen sind Unicode-Codepoints; LEN zählt Zeichen, nicht Bytes
(dokumentierte Abweichung). Randfälle: VAL liest das führende
Zahlenpräfix und überspringt Leerraum, versteht &H/&O;
STR$ stellt nicht-negativen Zahlen ein Leerzeichen voran;
LEFT$/RIGHT$ mit Länge über der Stringlänge liefern den ganzen
String; ASC("") sowie eine Startposition kleiner 1 bei
MID$/INSTR lösen Fehler 5 aus. STRING$ nimmt einen Zeichencode
oder einen String (dessen erstes Zeichen zählt).
System
| Element | Art |
|---|---|
COMMAND$ |
Funktion |
SLEEP |
Anweisung |
SYSTEM |
Anweisung |
ENVIRON$ liest Umgebungsvariablen nach Namen, COMMAND$ liefert die
Aufrufargumente ohne Programmnamen. Nicht abbildbare Größen liefern
einen dokumentierten Ersatzwert statt still zu variieren.
Tastatur
| Element | Art |
|---|---|
INKEY$ |
Funktion |
INPUT$ |
Funktion |
KEY |
Anweisung |
INKEY$ blockiert nicht: leerer String bei leerem Puffer, ein Zeichen
bei einer Zeichentaste, zwei Zeichen mit führendem Nullzeichen bei
einer Sondertaste. INPUT$(n) liest genau n Zeichen und blockiert
dabei, ohne sie am Bildschirm zu wiederholen.
KEY n, text$ belegt ein Funktionstasten-Makro (n = 1–10 sowie 30/31,
höchstens 15 Zeichen), KEY LIST gibt alle zwölf untereinander aus,
KEY ON/KEY OFF blendet die Softkey-Zeile ein und aus.