The book is currently only available in German.
Bedingungen — `wenn` / `sonst`
Mit Bedingungen entscheidet dein Programm, was es tun soll.
6.1 Einfaches wenn
nimm temperatur = 30
wenn temperatur > 25 {
sag "Es ist warm!"
}
6.2 wenn / sonst
nimm alter = 16
wenn alter >= 18 {
sag "Erwachsen"
} sonst {
sag "Minderjährig"
}
6.3 Mehrere Bedingungen mit sonstwenn
nimm note = 4.5
wenn note >= 5.5 {
sag "Sehr gut"
} sonstwenn note >= 4.0 {
sag "Genügend"
} sonstwenn note >= 1.0 {
sag "Ungenügend"
} sonst {
sag "Ungültig"
}
6.4 wenn mit kombinierten Bedingungen
nimm alter = 25
nimm hat_geld = wahr
wenn alter >= 18 und hat_geld {
sag "Kann Auto kaufen"
} sonstwenn alter >= 18 oder hat_geld {
sag "Eines davon stimmt"
} sonst {
sag "Weder noch"
}
6.5 Der häufigste Tippfehler: = statt ==
Du willst wissen, ob alter gleich 18 ist — und tippst ein Gleichheitszeichen zu wenig:
nimm alter = 20
wenn alter = 18 {
sag "Genau 18"
}
Kiste startet das Programm gar nicht. Es sagt dir vorher, was los ist:
mein_programm.ki:3:12: `=` ist eine Zuweisung, kein Vergleich — meintest du `==`? In einer Bedingung darf nichts zugewiesen werden (`wenn x = 5` setzt x auf 5, statt zu prüfen, ob x gleich 5 ist).
Vorne stehen Datei, Zeile und Spalte — 3:12 ist genau das Gleichheitszeichen.
Warum Kiste hier nicht einfach weitermacht. Die beiden Zeichen bedeuten zwei völlig verschiedene Dinge:
| Du schreibst | Kiste versteht |
|---|---|
alter = 18 |
Setze alter auf 18. |
alter == 18 |
Frage: Ist alter gleich 18? |
In der Bedingung stünde also ein Befehl statt einer Frage. Er würde alter überschreiben — und die Bedingung wäre danach immer erfüllt. So sähe das aus, ausgeschrieben:
nimm alter = 20
alter = 18 // das tut `=`: es setzt
wenn alter == 18 { // und danach stimmt es natürlich
sag "Genau 18"
}
Dieses Programm gibt Genau 18 aus — obwohl in alter vorher 20 stand. Das ist ein Fehler, der keinen Fehler meldet: Das Programm läuft, tut etwas anderes als gemeint, und die Variable ist zusätzlich überschrieben. Genau deshalb verbietet Kiste die Zuweisung in einer Bedingung. Eine klare Meldung beim Start ist besser als ein stiller Schaden im Betrieb.
Die Reparatur ist ein einziges Zeichen:
nimm alter = 20
wenn alter == 18 {
sag "Genau 18"
} sonst {
sag "Nicht 18, sondern {alter}."
}
Ausgabe: Nicht 18, sondern 20. — jetzt fragt das Programm wirklich.
Bei wahr/falsch brauchst du den Vergleich gar nicht. Eine Variable, die schon wahr oder falsch ist, darf direkt als Bedingung stehen:
nimm erledigt = falsch
wenn erledigt {
sag "Fertig!"
} sonst {
sag "Noch nicht fertig."
}
wenn nicht erledigt {
sag "Es ist noch etwas zu tun."
}
Ausgabe:
Noch nicht fertig.
Es ist noch etwas zu tun.
wenn erledigt == wahr wäre erlaubt, ist aber umständlich — und wenn erledigt = wahr ist genau der Tippfehler von oben. Wer sich die kurze Form angewöhnt, kann ihn gar nicht machen.
Die Regel gilt in jeder Bedingung, nicht nur bei wenn:
| Stelle | Das lehnt Kiste ab |
|---|---|
wenn |
wenn alter = 18 { … } |
sonstwenn |
} sonstwenn note = 4.0 { … } |
solange (Kapitel 7) |
solange i = 5 { … } |
| in einer zusammengesetzten Bedingung | wenn (alter = 18) und hat_geld { … } |
Alle vier bringen dieselbe Meldung — und zwar sowohl bei kiste run als auch bei kiste build.
Auch prüfe und fall (Abschnitt 6.6) lehnen eine Zuweisung ab — dort mit einer eigenen, auf die Stelle gemünzten Meldung. Du siehst sie gleich.
Merke: Ein
=setzt, zwei==fragen. Meldet Kiste „=ist eine Zuweisung, kein Vergleich", fehlt genau ein Zeichen.
6.6 prüfe — Mehrfach-Auswahl
Wenn du gegen viele Werte prüfst, ist prüfe (switch) übersichtlicher:
nimm tag = "montag"
prüfe tag {
fall "montag", "dienstag", "mittwoch", "donnerstag", "freitag" {
sag "Arbeitstag"
}
fall "samstag", "sonntag" {
sag "Wochenende!"
}
standard {
sag "Kein gültiger Tag"
}
}
Auch hier gilt: ein = setzt, zwei == fragen. prüfe vergleicht — genau wie wenn —, darum ist eine Zuweisung an zwei Stellen verboten. An beiden erklärt Kiste, was an dieser Stelle gemeint war.
Erstens der Wert hinter prüfe:
nimm x = 1
prüfe x = 5 {
fall 5 { sag "fünf" }
}
mein_programm.ki:3:9: `=` ist eine Zuweisung, kein Vergleich — meintest du `prüfe x`? Nach `prüfe` steht der Wert, der geprüft wird; die Vergleiche stehen in den `fall`-Zweigen (`prüfe x = 5` setzt x auf 5 und prüft dann 5 — egal, was vorher in x stand).
Das ist der Kern: prüfe x = 5 würde x auf 5 setzen und danach 5 prüfen — was vorher in x stand, wäre weg und für die Auswahl völlig egal. Hinter prüfe gehört nur der Wert, den du anschauen willst (prüfe x); die Vergleiche macht fall.
Zweitens der Wert hinter fall:
nimm x = 5
nimm y = 1
prüfe x {
fall y = 5 { sag "fünf" }
}
mein_programm.ki:5:12: `=` ist eine Zuweisung, kein Vergleich. Ein `fall`-Wert ist der Wert, mit dem verglichen wird (`fall y = 5` setzt y auf 5 und vergleicht dann gegen 5 — egal, was vorher in y stand).
Hier schlägt Kiste nichts vor — und das ist Absicht: ob du fall 5 gemeint hast oder fall y, kann Kiste nicht wissen, und ein falscher Vorschlag wäre schlimmer als keiner. Ein fall-Wert ist immer der Wert, gegen den verglichen wird.
Klammern helfen übrigens nicht: fall (y = 5) wird genauso abgelehnt. Eine Zuweisung ist an einer vergleichenden Stelle nie gemeint, geklammert oder nicht.