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>
314 lines
8.8 KiB
Markdown
314 lines
8.8 KiB
Markdown
# Bibliotheksreferenz
|
||
|
||
Die Laufzeitbibliothek **so wie implementiert**. Der Umfang wird von
|
||
[docs/inventar.md](inventar.md) bestimmt; dort steht auch, was noch offen
|
||
ist. Abweichungen vom Vorbild sind in
|
||
[docs/sprachreferenz.md](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.
|