Zwei neue Capabilities in den Hauptspecs: - datei-eio: Dateiverwaltung, drei Zugriffsarten, UTF-32-Festtextfelder, Recordkonvertierung, Sperren, Dateisystem-Anweisungen - sprachinventar: das Vollstaendigkeits-Inventar als pruefbares Artefakt Fortgeschrieben: textbildschirm (Doppelzellen, Groessenunabhaengigkeit, Bildschirmanweisungen), konsolen-basisbibliothek (Host-Neuschnitt, volle String-/Format-/Datums-/Finanzbibliothek), kompat-testkorpus (Snapshot-Vergleich, Nachweis der Groessenunabhaengigkeit), sprach-frontend (Signaturpflicht, ON-ERROR-Scoping, DATA-Rohtext). Bilanz: +32 Anforderungen, 6 geaendert, 1 ersetzt. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
209 lines
10 KiB
Markdown
209 lines
10 KiB
Markdown
## ADDED Requirements
|
|
|
|
### Requirement: Vollständige Stringbibliothek
|
|
Die Bibliothek SHALL sämtliche in der Original-Hilfe dokumentierten
|
|
Stringfunktionen und -anweisungen mit der Semantik des Vorbilds
|
|
bereitstellen — darunter `LEN`, `LEFT$`, `RIGHT$`, `MID$` (Funktion und
|
|
Anweisung), `INSTR`, `UCASE$`, `LCASE$`, `LTRIM$`, `RTRIM$`, `STRING$`,
|
|
`SPACE$`, `CHR$`, `ASC`, `STR$`, `VAL`, `HEX$`, `OCT$` und `SWAP` für
|
|
Strings. Zeichen sind Unicode-Codepoints (dokumentierte Abweichung).
|
|
Randfälle folgen dem Vorbild: `VAL` liest das führende Zahlenpräfix und
|
|
überspringt Leerraum, `STR$` stellt nicht-negativen Zahlen ein Leerzeichen
|
|
voran, `ASC("")` löst Laufzeitfehler 5 aus, eine Startposition kleiner 1
|
|
bei `MID$`/`INSTR` ebenso, `LEFT$`/`RIGHT$` mit Länge über der Stringlänge
|
|
liefern den ganzen String. Welche Elemente die Liste umfasst, MUST das
|
|
Sprachinventar bestimmen; ein dort als `implementiert` geführtes Element
|
|
MUST verfügbar sein.
|
|
|
|
#### Scenario: VAL mit Restzeichen
|
|
- **WHEN** `VAL(" 12.5abc")` ausgewertet wird
|
|
- **THEN** ist das Ergebnis 12.5
|
|
|
|
#### Scenario: Länge über Stringende
|
|
- **WHEN** `LEFT$("ab", 10)` ausgewertet wird
|
|
- **THEN** ist das Ergebnis `ab`
|
|
|
|
#### Scenario: Ungültige Startposition
|
|
- **WHEN** `MID$("abc", 0)` ausgewertet wird
|
|
- **THEN** tritt Laufzeitfehler 5 auf
|
|
|
|
### Requirement: PRINT USING und FORMAT$
|
|
`PRINT USING`, `LPRINT USING` und `FORMAT$` SHALL die Formatzeichen des
|
|
Vorbilds unterstützen: numerische Platzhalter (`#`), Dezimalpunkt,
|
|
Tausendertrennung (`,`), Vorzeichenführung (`+`, `-`), Währungs- und
|
|
Füllzeichen (`$$`, `**`, `**$`), Exponentialform (`^^^^`) sowie die
|
|
String-Platzhalter `&`, `!` und `\ \`. Literale Zeichen SHALL unverändert
|
|
übernommen werden, `_` SHALL das Folgezeichen literal machen. Passt ein
|
|
Wert nicht in das Feld, SHALL die Ausgabe mit einem `%`-Präfix erfolgen
|
|
und der Wert vollständig dargestellt werden; dieses Überlaufverhalten MUST
|
|
in der Sprachreferenz festgehalten sein. Eine Formatzeichenkette ohne
|
|
Platzhalter bei vorhandenen Argumenten MUST Laufzeitfehler 5 auslösen.
|
|
`SetFormatCC` SHALL das für `$$` verwendete Währungszeichen und die
|
|
zugehörige Stellung setzen; ohne Aufruf gilt ein dokumentierter
|
|
Vorgabewert.
|
|
|
|
#### Scenario: Numerisches Feld mit Nachkommastellen
|
|
- **WHEN** `PRINT USING "###.##"; 3.14159` ausgeführt wird
|
|
- **THEN** lautet die Ausgabe ` 3.14`
|
|
|
|
#### Scenario: Feldüberlauf
|
|
- **WHEN** `PRINT USING "##"; 12345` ausgeführt wird
|
|
- **THEN** beginnt die Ausgabe mit `%` und enthält den vollständigen Wert
|
|
|
|
#### Scenario: Formatzeichenkette wird wiederverwendet
|
|
- **WHEN** `PRINT USING "## "; 1; 2; 3` ausgeführt wird
|
|
- **THEN** wird die Formatzeichenkette für jeden Wert erneut angewandt
|
|
|
|
### Requirement: Datums- und Zeitbibliothek
|
|
Die Bibliothek SHALL die Datums- und Zeitfunktionen des Vorbilds
|
|
bereitstellen: `DATE$` und `TIME$` als Funktion und als Anweisung, `TIMER`,
|
|
`NOW`, `DATESERIAL`, `TIMESERIAL`, `DATEVALUE`, `TIMEVALUE`, `DAY`,
|
|
`MONTH`, `YEAR`, `WEEKDAY`, `HOUR`, `MINUTE`, `SECOND`. Serielle Datumswerte
|
|
SHALL der Zählweise des Vorbilds folgen (ganzzahliger Anteil = Tag,
|
|
Nachkommaanteil = Tageszeit). `WEEKDAY` SHALL 1 für Sonntag liefern.
|
|
Ungültige Datums- oder Zeitangaben MUST Laufzeitfehler 5 auslösen.
|
|
|
|
#### Scenario: Serienwert und Rückumwandlung
|
|
- **WHEN** `d = DATESERIAL(1992, 3, 15)` gebildet und `YEAR(d)`, `MONTH(d)`, `DAY(d)` ausgewertet werden
|
|
- **THEN** liefern sie 1992, 3 und 15
|
|
|
|
#### Scenario: Wochentagszählung
|
|
- **WHEN** `WEEKDAY` auf einen Sonntag angewandt wird
|
|
- **THEN** ist das Ergebnis 1
|
|
|
|
#### Scenario: Ungültiges Datum
|
|
- **WHEN** `DATESERIAL(1992, 13, 1)` ausgewertet wird
|
|
- **THEN** tritt Laufzeitfehler 5 auf
|
|
|
|
### Requirement: Kompatibler Zufallszahlengenerator
|
|
`RND` und `RANDOMIZE` SHALL die Zahlenfolge des Vorbilds reproduzieren:
|
|
gleicher Startwert MUST dieselbe Folge liefern. `RND` ohne Argument und
|
|
mit positivem Argument SHALL die nächste Zahl liefern, mit Argument 0 die
|
|
zuletzt gelieferte wiederholen, mit negativem Argument die Folge auf einen
|
|
aus dem Argument abgeleiteten Startwert setzen. `RANDOMIZE` ohne Argument
|
|
SHALL einen Startwert erfragen, `RANDOMIZE TIMER` einen zeitabhängigen
|
|
setzen. Der verwendete Algorithmus MUST in der Sprachreferenz dokumentiert
|
|
sein.
|
|
|
|
#### Scenario: Reproduzierbare Folge
|
|
- **WHEN** zweimal `RANDOMIZE 42` gefolgt von drei `RND`-Aufrufen ausgeführt wird
|
|
- **THEN** sind beide Dreierfolgen identisch
|
|
|
|
#### Scenario: RND(0) wiederholt
|
|
- **WHEN** nach einem `RND`-Aufruf `RND(0)` ausgewertet wird
|
|
- **THEN** liefert es denselben Wert wie der vorangegangene Aufruf
|
|
|
|
### Requirement: Mathematikbibliothek mit Überlaufverhalten
|
|
Die Bibliothek SHALL die numerischen Funktionen des Vorbilds
|
|
bereitstellen (`ABS`, `SGN`, `INT`, `FIX`, `SQR`, `EXP`, `LOG`, `SIN`,
|
|
`COS`, `TAN`, `ATN`, `CINT`, `CLNG`, `CSNG`, `CDBL`, `CCUR`). Rundung
|
|
SHALL kaufmännisch-symmetrisch zur geraden Zahl erfolgen (Banker's
|
|
Rounding). Überschreitet ein Ergebnis den Wertebereich des Zieltyps, MUST
|
|
Laufzeitfehler 6 „Overflow" auftreten; `SQR` und `LOG` mit unzulässigem
|
|
Argument MUST Laufzeitfehler 5 auslösen, Division durch null Fehler 11.
|
|
|
|
#### Scenario: Rundung zur geraden Zahl
|
|
- **WHEN** `CINT(0.5)` und `CINT(1.5)` ausgewertet werden
|
|
- **THEN** liefern sie 0 und 2
|
|
|
|
#### Scenario: Überlauf bei Konvertierung
|
|
- **WHEN** `CINT(40000)` ausgewertet wird
|
|
- **THEN** tritt Laufzeitfehler 6 auf
|
|
|
|
#### Scenario: Wurzel aus negativer Zahl
|
|
- **WHEN** `SQR(-1)` ausgewertet wird
|
|
- **THEN** tritt Laufzeitfehler 5 auf
|
|
|
|
### Requirement: Finanzmathematische Funktionen
|
|
Die Bibliothek SHALL die finanzmathematischen Funktionen des Vorbilds
|
|
bereitstellen: `FV#` (Endwert), `PV#` (Barwert), `Pmt#` (Zahlung),
|
|
`IPmt#` (Zinsanteil), `PPmt#` (Tilgungsanteil), `NPer#` (Anzahl
|
|
Zahlungsperioden), `Rate#` (Zinssatz), `NPV#` (Kapitalwert), `IRR#`
|
|
(interner Zinsfuß), `MIRR#` (modifizierter interner Zinsfuß), `SLN#`
|
|
(lineare Abschreibung), `SYD#` (arithmetisch-degressive Abschreibung) und
|
|
`DDB#` (geometrisch-degressive Abschreibung). Alle SHALL in DOUBLE
|
|
rechnen. Das Argument für die Fälligkeit SHALL zwischen nachschüssiger
|
|
und vorschüssiger Zahlung unterscheiden. Ungültige Argumente — etwa ein
|
|
Zinssatz von null bei `NPer#` oder eine Periode außerhalb der Laufzeit
|
|
bei `IPmt#`/`PPmt#` — MUST Laufzeitfehler 5 auslösen. `Rate#` und `IRR#`
|
|
nähern sich iterativ; findet die Näherung keine Lösung, MUST
|
|
Laufzeitfehler 5 auftreten statt eines stillen Ersatzwerts. Die
|
|
Abbruchbedingung der Näherung MUST in docs/bibliothek.md dokumentiert
|
|
sein.
|
|
|
|
#### Scenario: Endwert einer Rentenzahlung
|
|
- **WHEN** `FV#` für 10 Perioden, 5 % Zins und eine Zahlung von 100 nachschüssig ausgewertet wird
|
|
- **THEN** entspricht das Ergebnis dem dokumentierten Sollwert der Bibliotheksreferenz
|
|
|
|
#### Scenario: Zins- und Tilgungsanteil ergänzen sich
|
|
- **WHEN** `IPmt#` und `PPmt#` für dieselbe Periode desselben Darlehens ausgewertet werden
|
|
- **THEN** ist ihre Summe gleich `Pmt#` für dieses Darlehen
|
|
|
|
#### Scenario: Näherung ohne Lösung
|
|
- **WHEN** `IRR#` mit einer Zahlungsreihe ohne Vorzeichenwechsel ausgewertet wird
|
|
- **THEN** tritt Laufzeitfehler 5 auf
|
|
|
|
### Requirement: System- und Umgebungsanweisungen
|
|
`ENVIRON$` SHALL Umgebungsvariablen nach Namen oder Position liefern,
|
|
`ENVIRON` sie setzen. `COMMAND$` SHALL die Aufrufargumente ohne
|
|
Programmnamen liefern. `FRE` SHALL einen Speicherwert liefern, `CLEAR`
|
|
Variablen zurücksetzen, `TRON`/`TROFF` die Ablaufverfolgung schalten.
|
|
`STACK` SHALL als Anweisung die Stapelgröße setzen und als Funktion die
|
|
verfügbare Stapelgröße liefern. `SYSTEM` SHALL das Programm beenden und
|
|
die Kontrolle an das Betriebssystem zurückgeben. `ERDEV` und `ERDEV$`
|
|
SHALL den Fehlercode bzw. den Namen des zuletzt meldenden Geräts
|
|
liefern. Nicht abbildbare Größen (Speicher- und Stapelwerte, Gerätefehler)
|
|
MUST einen definierten, dokumentierten Ersatzwert liefern statt still zu
|
|
variieren; der Ersatzwert MUST in docs/sprachreferenz.md unter
|
|
„Abweichungen" stehen.
|
|
|
|
#### Scenario: Umgebungsvariable lesen
|
|
- **WHEN** eine Umgebungsvariable gesetzt ist und `ENVIRON$("NAME")` ausgewertet wird
|
|
- **THEN** liefert es deren Wert
|
|
|
|
#### Scenario: SYSTEM beendet das Programm
|
|
- **WHEN** ein Programm `SYSTEM` ausführt
|
|
- **THEN** endet es mit demselben Beendigungsstatus wie bei `END`
|
|
|
|
#### Scenario: Unbekannte Umgebungsvariable
|
|
- **WHEN** `ENVIRON$` für einen nicht gesetzten Namen ausgewertet wird
|
|
- **THEN** ist das Ergebnis der leere String
|
|
|
|
## MODIFIED Requirements
|
|
|
|
### Requirement: Host-Abstraktion für Konsolen-E/A
|
|
Alle Konsolenwirkungen der Ausführungsschicht SHALL über eine
|
|
austauschbare Host-Schnittstelle laufen, die einen Bildschirmzustand
|
|
darstellt statt eines Zeichenstroms: Übergabe des Zellenpuffers zur
|
|
Anzeige, Abholen von Tastatur- und Größenänderungsereignissen sowie die
|
|
Abbruchprüfung (Strg+Untbr). Host-Aufrufe dürfen blockieren.
|
|
`tbc run` SHALL einen Konsolen-Host verwenden, der den Puffer im Terminal
|
|
darstellt und Tastendrücke liefert. Tests MUST einen Host verwenden
|
|
können, der ohne Terminal arbeitet, den Bildschirmzustand nach jedem
|
|
Schritt festhält und vorbereitete Tastendrücke einspeist. Eine
|
|
Bildschirmwirkung, die nur über einen Zeichenstrom ausdrückbar wäre, MUST
|
|
NOT vorkommen: `LOCATE`, `COLOR`, `CSRLIN`, `POS` und die Funktionsform
|
|
von `SCREEN` MUST über diese Schnittstelle vollständig abgebildet sein.
|
|
|
|
#### Scenario: Capture-Host im Test
|
|
- **WHEN** ein Korpusprogramm im Test-Harness läuft
|
|
- **THEN** entsteht der vollständige Bildschirmzustand im Capture-Host und ist vergleichbar, ohne dass ein Terminal vorhanden ist
|
|
|
|
#### Scenario: Cursorbewegung über die Schnittstelle
|
|
- **WHEN** ein Programm `LOCATE 5, 10 : PRINT "x"` ausführt
|
|
- **THEN** meldet der Host-Bildschirmzustand das Zeichen `x` an Position (5, 10)
|
|
|
|
#### Scenario: Tastendruck aus dem Host
|
|
- **WHEN** der Test-Host einen vorbereiteten Tastendruck liefert und das Programm `INKEY$` auswertet
|
|
- **THEN** erhält das Programm diese Taste
|
|
|
|
## REMOVED Requirements
|
|
|
|
### Requirement: Korpus-Stringfunktionen
|
|
**Reason**: Die auf den Phase-2-Korpus zugeschnittene Teilliste wird durch
|
|
die Anforderung „Vollständige Stringbibliothek" ersetzt, die den
|
|
vollständigen dokumentierten Funktionsumfang fordert und ihren Umfang aus
|
|
dem Sprachinventar bezieht.
|
|
**Migration**: Alle bisher geforderten Funktionen und Randfälle sind in
|
|
„Vollständige Stringbibliothek" enthalten; kein Verhalten entfällt.
|