| Titelblatt | Lektion 1 | Lektion 2 | Lektion 3 | Lektion 4 | Lektion 5 | Lektion 6 | Referenzen |
|---|---|---|---|---|---|---|---|
| Erster Anlauf | Variable und Funktionen | Immer wieder Listen | Das erste Gerippe | Etwas mehr Fleisch | Noch etwas Salz an die Suppe |
Wir haben nun schon einiges über Variable und Funktionen gelernt. Und nun begeben wir uns in die finsteren Abgründe der Listenstrukturen von Scheme. Schleichen wir los.
Bevor wir uns erbarmungslos in das Listengetümmel stürzen, sehen wir uns erst einmal den Unterschied zwischen atomaren Werten und Listen genauer an.
Wir haben die atomaren Werte bereits in der vorangegangenen Lektion kennengelernt, als wir die Variablen initialisierten. Ein atomarer Wert ist einfach nur ein einzelner Wert. Er hat keine weiteren Bestandteile. So können wir zum Beispiel in der folgenden Anweisung der Variablen "x" den einfachen oder atomaren Wert "8" zuweisen:
(let* ( (x 8)) x)
Zusatzbemerkung:
Wir haben den Ausdruck "x" an das Ende der Anweisungsliste hinzugefügt,
um den zugewiesenen Wert auszugeben. Normalerweise wird das nicht benötigt.
Da "let*" wie eine Funktion arbeitet, wird der Wert des letzten Ausdruckes
zurückgegeben.
Eine Variable kann jedoch neben einem atomaren Wert auch eine Liste von Werten zugewiesen bekommen. Um der Variablen "x" die Liste der Werte 1, 3 und 5 zuzuordnen, schreiben wir:
(let* ( (x '(1 3 5) )) x)
Versuchen wir den Unterschied mit Hilfe des Script-Fu-Consolen-Fensters herauszufinden. Geben wir die erste Anweisung ein, erhalten wir den Wert:
8
Im Gegensatz dazu erhalten wir bei der Eingabe der zweiten Anweisung das Ergebnis:
(1 3 5)
Mit der Anzeige des Wertes "8" wird ein atomarer Wert angezeigt. Die Anzeige des Klammerausdruckes "(1 3 5)" informiert uns darüber, daß es sich bei dem Ergebnis um eine Liste handelt und nicht um einen atomaren Wert.
Zusatzbemerkung:
Beachten Sie, daß sich weder in der Zuweisung noch in der Ausgabe
ein Komma zwischen den einzelnen Werten befindet. Wer sich schon mit Tcl
abgegeben haben, hat hier bestimmt den Aha-Effekt.
Die Liste hat folgenden Aufbau:
'(a b c)
wobei a, b und c die Literale der Liste sind. Das Zeichen Apostroph ' vor der Klammer wird dazu verwendet, um zu signalisieren, daß es sich bei dem folgenden Klammerausdruck nicht um eine Funktion, sondern um eine Liste handelt.
Eine leere Liste stellt sich somit folgendermaßen dar:
'()
oder noch einfacher:
()
Listen können selbst wiederum Listen als Bestandteile haben, wie das im folgenden Beispiel demonstriert wird:
(let*
(
(x '("The GIMP" (1 2 3) ("is" ("great" ()) ) ) )
)
x
)
Geben Sie diese Anweisung als einzeilige Anweisung in das Fenster der Script-Fu-Console ein und beobachten Sie was geschieht.
Was ist zu dieser Scheme-Anweisung noch zu bemerken?
Im Gegensatz zu numerischen Werten und Variablen sind Zeichenketten in doppelte Hochkommas " einzuschließen, um sie von den Variablen unterscheiden zu können.
Nach dem ersten einfachen Apostroph, welches eine Liste einleitet, ist innerhalb der Liste bei weiteren Listenbestandteilen das Apostroph wegzulassen.
Die oben definierte Liste besteht aus drei Literalen. Das erste Literal ist die Zeichenkette "The GIMP". Das zweite Literal besteht wieder aus einer Liste mit drei atomaren Werten (1 2 3). Und das letzte und dritte Literal besteht aus einer Reihe geschachtelter Literale. Analysieren Sie dieses Literal einfach selbst.
Um Variable zu Listen zu verbinden, wird die Funktion "cons" verwendet
(cons c (cons y () ) )
Diese Anweisung fügt der Variablen "y" die leere Liste "()" hinzu. Dann wird diese Liste der Variablen "c" hinzugefügt.
Um eine Liste aus Literalen und und vorher definierte Variablen zu erzeugen, setzen wir die "list"-Funktion ein
(list 5 4 3 a b c)
Diese Anweisung verbindet die drei numerischen Werte und den Inhalt der drei Variablen zu einer Liste. Zum Beispiel:
(let* (
(a 1)
(b 2)
(c 3)
)
(list 5 4 3 a b c)
)
Diese Anweisung liefert die Liste (5 4 3 1 2 3) zurück. Und wer es nicht glaubt, überprüft es einfach.
Um auf einzelne Werte innerhalb einer Liste zugreifen zu können, verwenden wir die Funktionen car und cdr, welche das erste Element bzw. alle Elemente nach dem ersten Element (also den Rest) der Liste zurückliefern.
Die Funktion "car" liefert das erste Listenelement der Ausgangsliste. Dieses Element wird auch als Kopfelement bezeichnet. Das folgende Beispiel soll die Funktionsweise der "car"-Funktion veranschaulichen:
(car '("first" 2 "third"))
Das Ergebnis dieser Anweisung ist:
"first"
Die Funktion "cdr" liefert den Rest der Liste nach dem Kopfelement. Enthält die Liste nur ein Element, ist das Ergebnis der "cdr"-Funktion eine leere Liste.
Die Funktion "cdr" wieder angewendet in dem folgenden Beispiel:
(cdr '("first" 2 "third"))
liefert das Ergebnis:
(2 "third")
Während das folgende Beispiel:
(cdr '("one and only"))
eine leere Liste als Ergebnis liefert
()
Gut und schön. Wir können nun auf das erste Element einer Liste und deren Rest wunderbar mit den Funktionen "car" und "cdr" zugreifen. Doch wie erhalten wir nun das zweite, dritte oder jedes weitere Element einer Liste?
Dazu gibt es weitere Funktionen, die uns die Arbeit erleichtern. So gibt es zum Beispiel eine Funktion, die das Kopfelement von einem Listenrest liefert (cadr) oder den Rest vom Rest einer Liste (cddr) usw.
Eine Konstruktion dieser Funktionsnamen läßt sich relativ leicht ableiten: das "a" steht für das Kopflistenelement (Anfang der Liste) und das "d" steht für den Listenrest.
So kann zum Beispiel für die Anweisung:
( car (cdr (car x)))
auch folgendes geschrieben werden:
(cadar x)
Eine vollständige Beschreibung aller Listen-Funktionen ist auf der SIOD-Home-Page zu finden. Hier sind aktuellen Versionen von Scheme zu finden, auf die Script-Fu von GIMP aufbaut.
Damit Sie ein wenig Übung mit den Umgang dieser Listenfunktion erhalten, versuchen Sie verschiedene Varianten von car und cdr in der folgenden Anweisung in das Fenster der Script-Fu-Console einzugeben:
(let*
(
(x '(
(1 2 (3 4 5) 6)
7 8
( 9 10)
)
)
; hier kodieren Sie Ihre "car/cdr"-Aufrufe
)
Versuchen Sie zum Beispiel die Zahl "3" aus der Listenstruktur mit nur zwei Funktionsaufrufen herauszufischen. Sollten Sie das erfolgreich schaffen, können Sie sich schon fast als Meister aller Script-Fu-Klassen bezeichnen. Also nachgedacht und nicht nur probiert!
Kurze Verschnaufpause. Und weiter geht es mit Lektion 4
| Titelblatt | Lektion 1 | Lektion 2 | Lektion 3 | Lektion 4 | Lektion 5 | Lektion 6 | Referenzen |
|---|---|---|---|---|---|---|---|
| Erster Anlauf | Variable und Funktionen | Immer wieder Listen | Das erste Gerippe | Etwas mehr Fleisch | Noch etwas Salz an die Suppe |