Eine weitere Möglichkeit, dass eine Verzweigung komplexer wird,
kann aber auch sein, dass nicht nur zwischen 'wahr' und 'falsch'
unterschieden werden soll, sonder zwischen mehreren Möglichkeiten.
In diesem Fall ist die Funktion
(if ...) nicht mehr
geeignet. Für Mehrfachauswahlen stellt uns Lisp die Funktion
(cond ...) zur Verfügung. Diese Funktion hat eine vielleicht
etwas gewöhnungsbedürftige Syntax, wodurch sie wohl von den Argumenten
her die komplizierteste aller Funktionen in AutoLisp ist:
(cond
(test1 ausdr1-1 ausdr1-2 ...)
(test2 ausdr2-1 ausdr2-2 ...)
(test3 ausdr3-1 ausdr3-2 ...)
.
.
)
Jedes Argument für
(cond) ist eine Liste. Diese enthält als
erstes Unterargument einen Test, danach beliebig viele Ausdrücke,
die im WENN-Fall des Testausdrucks abgearbeitet werden. Es gibt
im Gegensatz zu
(if) keine SONST-Anweisungen.
Wenn einer der Testausdrücke sich als wahr erwiesen hat, werden
die dazugehörenden WENN-Ausdrücke evaluiert und anschliessend die
ganze
(cond)-Anweisung beendet. Es kann also niemals mehr
als ein Test wahr werden. Allerdings kann das Gegenteil der Fall
werden: Keiner der Testausdrücke wird wahr. In der Praxis findet
man deshalb häufig einen letzten Testausdruck, der immer wahr wird:
(cond
((= farbe 0) "VONBLOCK")
((= farbe 1) "ROT")
((= farbe 2) "GELB")
((= farbe 3) "CYAN")
((= farbe 4) "GRÜN")
((= farbe 5) "MAGENTA")
((= farbe 6) "BLAU")
((= farbe 7) "WEISS")
((< 7 farbe 256)farbe)
((= farbe 256) "VONLAYER")
('T "Falsche Farbnummer")
)
Die Rückgabe von
(cond ...) ist - wie bei
(if ...)
immer der Wert des letzten evaluierten Ausdrucks. In unserem
Beispiel ist das immer eine der Zeichenketten, ausser wenn die
Farbe zwischen 8 und 255 liegt, dann wird die Variable
farbe
evaluiert und der Wert zurückgegeben.
Lassen Sie uns das letzte Beispiel unter die Lupe nehmen: Es wird der
Inhalt der Variablen
farbe untersucht. Die Fälle, in denen
der Inhalt 0 - 7 oder 256 beträgt, sind einzeln geregelt. Liegt die
Farbnummer zwischen 8 und 255, wird die Farbnummer unverändert
zurückgegeben. Alle anderen Fälle sind durch den Testausdruck 'T
abgedeckt. Dieser ist immer wahr, daher wird diese Verzweigung
immer ausgeführt, wenn keiner der vorhergehenden Tests wahr wurde.
Natürlich können Sie das
'T durch irgendetwas anderes ersetzen,
das immer wahr wird, z.B. (/= 3 4), (not nil) oder was Ihnen sonst
noch einfällt. Die in vielen Programmen anzutreffende Praxis
(cond ... (T ...)) ist, wie bereits besprochen, davon abhängig,
dass das Symbol T nicht versehentlich umdefiniert wurde (betrifft nur
AutoLisp-Versionen bis 14). Auch ein ungebundenes Symbol evaluiert immer
zu T, daher ist es eine gute Idee, wenn man an dieser Stelle das
Symbol
'default verwendet, wie es der eine oder andere sicherlich
aus anderen Sprachen kennen wird.
Vielleicht sind Sie irritiert, dass
(cond) plötzlich das
akzeptiert, was im vorigen Kapitel bei unseren ersten Versuchen mit
(if) zu einem Fehler geführt hat, nämlich die Doppelklammern.
Der Unterschied ist, dass
(if) Ausdrücke als Argumente erwartet,
(cond) jedoch möchte Listen mit Ausdrücken. Da auch
(cond)
seine Argumente allesamt automatisch quotiert, ergeben sich hier also
quotierte Listen, die im weiteren Verlauf gar nicht als Ganzes
evaluiert werden, da ihre Elemente einzeln und nacheinander ausgeführt
werden.
Das Wichtigste aus den letzten drei Kapiteln noch einmal in Kürze
zusammengefasst:
-
AutoLISP bietet keine Möglichkeit, echte Konstanten zu definieren
-
Die Funktion (if) ermöglicht es einem Programm, aufgrund
eines Testergebnisses zu verzweigen
-
Wenn der WENN- oder SONST-Zweig einer (if)-Anweisung aus
mehreren Ausdrücken bestehen soll, müssen diese mit (progn) zu
einem Ausdruck zusammengefasst werden
-
Testfunktionen in AutoLISP geben T oder nil zurück
-
Jeder Ausdruck kann als Testausdruck verwendet werden, wenn er
in der Lage ist, je nach Sachlage nil oder etwas anderes
zurückzugeben
-
Mehrere Testfunktionen können durch (and), (or)
und (not) zu einem neuen Testausdruck kombiniert werden
-
Wenn zwischen mehr als zwei Möglichkeiten entschieden werden soll,
muss (cond) anstelle von (if) verwendet werden
-
Während (if) WENN- und SONST-Ausdrücke als Argumente
erwartet, müssen wir an (cond) Listen mit Tests sowie
WENN-Ausdrücken übergeben.
-
Die Testausdrücke in (cond) sind unabhängig voneinander.
Sobald sich ein Testausdruck als wahr erwiesen hat, werden die
dazugehörenden WENN-Ausdrücke nacheinander evaluiert und dann
die (cond)-Anweisung beendet.
-
Als letzten Testausdruck setzt man bei (cond) oft einen
Ausdruck ein, der immer wahr wird. Damit wird verhindert, dass
irgendwelche Möglichkeiten durch das Auswahlsieb rutschen.
-
Bei jedem Gebrauch von (if) sollte man überlegen, ob
nicht der Testausdruck alleine ausreicht