Syntax: (if <Bedingung&> <ja - Fall> <nein - Fall>) Syntax: (if <Bedingung&> <ja - Fall>)
Liefert die Bedingung ein anderes Ergebnis als #f , dann wird der ja - Fall ausgewertet.
if ist die einfache Verzweigung. In der Regel wird man statt des if jedoch cond verwenden, da es komfortabler ist. Sollen bei if im ja - Fall mehrere Ausdrücke ausgewertet werden (Nebeneffekte), dann muss man sie mit "(begin ... )" klammern. Das ist bei cond nicht notwendig.
Beispiele
Syntax: (cond <Verzweigung-1> <Verzweigung2> ...)
Jede der Verzweigungen besteht dann aus ...
(<Bedingung> <Ausdruck> ...)
... und die letzte Bedingung (sollte) muss ein else sein, dient also dazu, alle verbleibenden Alternativen abzufangen. Dem else folgt ebenfalls eine auszuwertender Ausdruck.
Die Verzweigungen werden nach einander abgearbeitet. Die erste wahre Bedingung führt zu einem Ausstieg, nachfolgende Bedingungen werden also nicht mehr bearbeitet.
Der bemerkenswerte Aspekt ist, dass der Bedingungsausdruck in der Regel einen Funktionsaufruf darstellt. Natürlich muss es sich dabei um eine boolsche Funktion handeln. Da Scheme als boolsche Werte neben dem Wert #f auch alle anderen Werte (die dann als #t interpretiert werden) zulässt, können hier "beliebig" komplizierte Aufrufe stehen -auch rekursive Selbstaufrufe- und diese können "beliebige" Nebeneffekte haben.
Es ist sogar zulässig, den Ausdruck wegzulassen. Wenn dann die Bedingung einen anderen Wert als #f zurückliefert, tritt er an die Stelle des Ausdrucks.
[Eine weitere Variante habe ich hier nicht erläutert.]
Ein Beispiel:
(define x 3) (cond ((negative? x) "Die Zahl ist negativ.") ((zero? x) "Die Zahl ist null.") ((> x 0) "Die Zahl ist positiv.") (else "Das geht nicht!"))Das Beachten der Reihenfolge kann sehr wichtig sein:
(define liste <irgendeine Liste>) (cond ((null? (cdr liste)) <irgendein Ausdruck>) ((null? liste) "Es gibt kein erstes Element" ) (else <irgendwas>))
... führt bei einer leeren Liste zu einem Fehler, da versucht wird (cdr liste) auszuwerten. Die Bedingung mit (null? liste) muss also vor der anderen kommen.
Syntax: (case <Identifizierer> <Verzweigung-1> <Verzweigung-2> ...)
Der Identifizierer kann eine Variable sein, aber auch ein Ausdruck. Die Verzweigungen enthalten zunächst eine Liste der Werte, die auf Übereinstimmung mit dem Identifizierer geprüft werden, anschließend den Ausdruck, der bei einem Treffer ausgewertet wird.
((<Wert-1> ...) <Ausdruck> ...),
Beispiel:
(define x 3) (case (* x x) ((1 2 3 5 6 7 8 10) 'kein-quadrat) ((4 9) 'quadrat)) (else 'geht-hier-nicht)) => quadrat
Syntax: (and <Bedingung-1> ...)
and und or sind weitgehend selbsterklärend. Wobei zu beachten ist, dass in beiden die Bedingungen schrittweise ausgewertet werden und dann abgebrochen wird, wenn der Wert klar ist: Beim and also nach der ersten falschen Bedingung und beim or nach der ersten richtigen Bedingung.
Syntax: (or <Bedingung-1> ...)
and und or sind weitgehend selbsterklärend. Wobei zu beachten ist, dass in beiden die Bedingungen schrittweise ausgewertet werden und dann abgebrochen wird, wenn der Wert klar ist: Beim and also nach der ersten falschen Bedingung und beim or nach der ersten richtigen Bedingung.