The book is currently only available in German.
Datentypen verstehen
Kiste hat drei Zahl-Typen (ganz, komma, dezimal) plus text, wahrheit, liste, karte, funktion und nichts.
4.1 Die drei Zahl-Typen
Wichtig — das ist eine Stelle, an der Kiste sich von JavaScript und Python unterscheidet. JS hat einen einzigen Zahl-Typ (Float). Das führt zu berühmten Bugs wie
0.1 + 0.2 != 0.3und Präzisionsverlust bei großen Zahlen. Kiste macht es richtig: drei klar getrennte Typen. (Siehe E-058 im Entscheidungs-Log.)
| Typ | Wofür | Literal | Beispiel |
|---|---|---|---|
ganz |
Ganzzahlen, beliebig groß | 42, 0xFF, 0b1010, 1_000_000 |
Schleifen, IDs, Bit-Operationen |
dezimal |
exakte Dezimalzahlen | 3.14, 0.1, 1.99 |
Geld, Steuern, Mathe für Anwender |
komma |
IEEE-754 Float (näherungsweise) | 1.99f, 42f, 1e6 |
Wissenschaft, Grafik, Wahrscheinlichkeit |
4.1.1 Ganz (ganz)
Ganzzahlen — Standard:
nimm zaehler = 42
nimm minus_sieben = -7
nimm hex = 0xFF // 255
nimm binaer = 0b1010 // 10
nimm gross = 1_000_000 // Unterstriche zur Lesbarkeit
Wichtig: Wie groß darf eine ganz-Zahl sein?
Die Antwort hängt vom Ausführungs-Pfad ab (siehe §1.2):
| Pfad | Maximum | Verhalten bei Überlauf |
|---|---|---|
kiste run (Tree-Walker) |
beliebig groß | kein Überlauf, 2 ^ 100 rechnet exakt |
kiste run --vm (VM) |
beliebig groß | kein Überlauf, identisch zum Tree-Walker |
kiste build (native) |
i64-Bereich: -9_223_372_036_854_775_808 bis 9_223_372_036_854_775_807 |
Überlauf → Programm-Abbruch mit deutscher Fehlermeldung |
// Tree-Walker und VM:
nimm riesig = 2 ^ 100 // funktioniert exakt
sag riesig // 1267650600228229401496703205376
// Native (kiste build):
nimm riesig = 2 ^ 100 // Compile-Error oder Laufzeit-Überlauf
// "Überlauf in Ganz-Arithmetik bei * (Zeile X, Spalte Y)"
Wann kümmert dich das? In der Praxis fast nie — i64 reicht für $9.2 \times 10^{18}$ und damit für alle realistischen Zähler, IDs, Indizes, Mengen. Nur wenn du echte Big-Integer-Mathematik machst (Kryptographie, Berechnung mit sehr großen Zahlen), spürst du den Unterschied. Dann: bleib im Tree-Walker oder fang den Überlauf mit versuche/fange ab.
4.1.1a Schutz vor Überlauf im nativen Pfad
// Wenn du im kiste-build-Pfad mit potentiell großen Zahlen rechnest:
versuche {
nimm produkt = a * b
sag(produkt)
} fange e {
sag("Zahl zu groß für Berechnung")
}
Im Tree-Walker fängt der versuche/fange nichts ab (weil kein Überlauf passiert). Im nativen Pfad fängt es genau den Überlauf-Throw ab. So bleibt dein Code in beiden Pfaden korrekt.
4.1.2 Dezimal (dezimal) — der Default für Kommazahlen
Exakte Dezimalrechnung, perfekt für Geld und alles, wo 0.1 + 0.2 == 0.3 gelten muss:
nimm preis = 1.99
nimm steuern = preis * 0.077
nimm gesamt = preis + steuern
sag 0.1 + 0.2 // 0.3 (exakt!)
sag 0.1 + 0.2 == 0.3 // wahr ← darauf kann man sich verlassen
Merke: Eine Zahl mit Punkt ist standardmäßig dezimal. Du musst dazu nichts Besonderes schreiben.
4.1.3 Komma (komma) — Fließkomma für Wissenschaft
IEEE-754 Float64, schnell, aber näherungsweise. Markiert mit f-Suffix:
nimm geschwindigkeit = 1.99f // explizit Komma
nimm lichtjahre = 1e6 // wissenschaftliche Notation → komma
nimm radius = 42f
Achtung: Mit komma gilt 0.1f + 0.2f != 0.3f (IEEE-754-Eigenheit). Verwende fast_gleich(a, b, toleranz) zum Vergleichen:
sag fast_gleich(0.1f + 0.2f, 0.3f, 0.0001f) // wahr
kiste check warnt automatisch, wenn du == zwischen Komma-Werten benutzt.
4.1.4 Wann nehme ich was?
| Frage | Antwort |
|---|---|
| Ganze Stückzahlen, IDs, Schleifen, Indizes? | ganz |
| Geld, Preise, Steuern, exakte Buchhaltung? | dezimal |
| Physik-Simulation, KI, 3D-Grafik, Wahrscheinlichkeiten? | komma (mit f-Suffix) |
| Du bist dir nicht sicher? | dezimal — der Default-Typ ist immer eine sichere Wahl |
4.1.5 Typen mischen
| Operation | Ergebnis |
|---|---|
ganz + ganz |
ganz |
ganz + dezimal |
dezimal (verlustfrei) |
ganz + komma |
komma |
dezimal + dezimal |
dezimal |
komma + komma |
komma |
dezimal + komma |
Fehler — explizit umwandeln |
Die strikte Trennung von dezimal und komma ist Absicht: die beiden sind konzeptionell verschiedene Welten (exakt vs. näherungsweise) und sie zu mischen ist fast immer ein Bug. Wenn du wirklich konvertieren willst, mach es explizit:
nimm preis = 1.99
nimm messwert = 0.5f
// nimm gesamt = preis + messwert // Fehler
nimm gesamt = preis + als_dezimal(messwert) // ok
4.1.6 Division
Division gibt immer das präzisere Ergebnis — nie Ganzzahl-Truncation wie in C oder Python 2:
sag 5 / 2 // 2.5 (dezimal — kein 2!)
sag 5 / 2.0 // 2.5
sag 7.5f / 3f // 2.5 (komma)
Wenn du wirklich Ganzzahl-Division willst, gibt es den div-Operator:
sag 5 div 2 // 2 (ganz)
sag 7 div 3 // 2
4.1.7 Konvertierung und Rundung
als_ganz(3.7) // 3 (schneidet Richtung Null ab)
als_ganz(-3.7) // -3
als_ganz("42") // 42
als_dezimal(42) // 42 als dezimal
als_dezimal("1.99") // 1.99 als dezimal
als_dezimal(0.1f) // 0.1 (gerundet auf 15 sig. Stellen)
als_dezimal_exakt(0.1f) // 0.1000000000000000055... (bit-genau, für Diagnose)
als_komma(42) // 42.0
als_komma(1.99) // 1.99 als komma (kann Präzision verlieren!)
runden(2.5) // 2 (kaufmännisch / banker's rounding)
runden(3.5) // 4
runden(3.14159, 2) // 3.14 (auf 2 Nachkommastellen)
aufrunden(2.1) // 3
abrunden(2.9) // 2
abschneiden(-2.7) // -2 (Richtung Null)
4.2 Text (text)
Zeichenketten, immer in doppelten Anführungszeichen:
nimm gruß = "Hallo!"
nimm name = "Sascha"
nimm leerer_text = ""
Achtung: Einfache Anführungszeichen ('...') gibt es in Kiste nicht.
4.3 Wahrheit (wahrheit)
Nur zwei Werte: wahr oder falsch.
nimm ist_aktiv = wahr
nimm ist_fertig = falsch
4.4 Liste (liste)
Eine geordnete Sammlung von Werten:
nimm zahlen = [1, 2, 3, 4, 5]
nimm namen = ["Anna", "Bert", "Clara"]
nimm gemischt = [1, "zwei", wahr, 3.14]
nimm leer = []
Zugriff auf Elemente per Index (beginnt bei 0):
nimm farben = ["rot", "grün", "blau"]
sag farben[0] // "rot"
sag farben[1] // "grün"
sag farben[2] // "blau"
4.5 Karte (karte)
Eine Sammlung von Schlüssel-Wert-Paaren:
nimm person = {
"name": "Sascha",
"alter": 38,
"stadt": "Zürich"
}
sag person["name"] // "Sascha"
sag person["alter"] // 38
4.6 Funktion (funktion)
Funktionen sind Werte wie alles andere in Kiste:
nimm verdoppeln = funktion(x) {
gib x * 2
}
sag verdoppeln(5) // 10
Mehr dazu in Kapitel 8.
4.7 Nichts (nichts)
Der "leere" Wert — wenn etwas keinen Wert hat:
nimm noch_nicht_gesetzt = nichts
wenn noch_nicht_gesetzt == nichts {
sag "Da ist nichts!"
}
Typ einer Variable herausfinden
typ(x) gibt einen Typ-Wert zurück (kein String!). Das macht Vergleiche tippfehler-sicher:
nimm x = 42
sag typ(x) // ganz
nimm y = 1.99
sag typ(y) // dezimal
nimm z = "Hallo"
sag typ(z) // text
// Vergleichen mit Typ-Konstanten — sicher und IDE-freundlich:
wenn typ(x) == Ganz {
sag "x ist eine Ganzzahl"
}
Verfügbare Typ-Konstanten: Ganz, Dezimal, Komma, Text, Wahrheit, Nichts, Liste, Karte, Bereich, Funktion, Klasse, Modul, Typ.