Skript-Fu-Einstieg: Listen
Aus GIMPForum
| << Variablen | ^ Inhaltsverzeichnis ^ | Funktionen >> |
Listen
Bis jetzt hast du gelernt, wie du einen Wert in eine Variable speichern kannst. Allerdings werden manchmal mehrere Werte benötigt; Farben in RGB brauchen z.B. drei Werte. Die eine Möglichkeit wäre jeden Wert in eine eigene Variabel zu speichern. Allerdings geht das auch einfacher nämlich mit Listen. Anstatt einem einzelnen Wert schreiben wir einfach alle Werte, die wir in die Liste packen wollen in eine Klammer mit einem Hochkomma davor:(let*
(
(X '(1 2 3))
)
)
Gespeichert werden die Werte nun folgendermassen:
Dass das erste Feld eine andere Farbe hat, ist kein Fehler o.ä. sondern liegt am Aufbau einer Liste.Eine Liste besteht immer aus einem "Head" (Erstes Element) und einem "Tail" (Rest). Der Grund dafür ist, dass der Zugriff auf einzelne Elemente über zwei Funktionen erfolgt: car und cdr. Mit car wird auf den Head zugegriffen und mit cdr auf den Rest. Wenn du auf den Rest zugreifst, dann entsteht dort wieder ein Head und ein Tail.
Ausnahme eine Liste mit nur einem Element. (car '(xxxx)) liefert xxxx aber (cdr '(xxxx)) liefert () ab, die leere Liste, und die hat keinen 'Head' und keinen 'Tail'. car oder cdr angewandt auf () ergibt eine Fehlermeldung (und Abbruch , falls man nicht mit catch gearbeitet hat)!
Hier wird mit cdr auf den Tail zugegriffen. Nun wird das erste Element der neuen Liste zum neuen Head und der Rest bleibt Tail. Um also auf das zweite Element zugreifen zu können, muss einmal cdr und dann car auf die Liste angewendet werden. Versuchen wir das doch einmal aus. Gehe in die Skript-Fu-Konsole und erstelle eine neue Liste:
(let*
(
(X '(4 5 6)) ;Deklaration der Liste
)
(+
(car X) ;Zugriff auf das 1. Element(4)
(car ;Zugriff auf den Head...
(cdr X) ;...des Tails
)
)
)
Semikolon: Durch Semikolons ( ; ) können Kommentare eingefügt werden. Der ganze Text bis zum Zeilenumbruch wird dabei beim Ausführen des Skripts ignoriert. Kommentare können sehr hilfreich sein um den Code übersichtlicher zu halten oder Anmerkungen hinzuzufügen.
Alternativ können mehrere cars und cdrs kombiniert werden. Beim obigen Beispiel würde anstatt (car (cdr X)) auch (cadr X) funktionieren. cdadr würde beispielsweise den Tail des Heads des Tails nehmen. D entspricht also einem Tail und A einem Head. Die Funktion ist allerdings auf maximal vier As bzw. Ds begrenzt. cdaddar beispielsweise ist nicht mehr gültig.
Falls du da das noch nicht zu 100% verstanden gibt es hier noch einige Übungen. Da der Zugriff auf Listen in Skript-Fu ziemlich wichtig ist, solltest du solange üben, bis du's wirklich im Urin hast.
Übungen:
Liste:
(let*
(
(liste '(1 78 90 2))
)
;Dein Code
)
Aufgabe 1: Greife auf die 1 zu.
Liste: (liste '(1 78 90 2))
Aufgabe 2: Greife auf die 78 zu.
Liste: (liste '(1 78 90 2))
Aufgabe 3: Greife auf die 90 zu.
Liste: (liste '(1 78 90 2))
Aufgabe 4: Greife auf die 2 zu.
Liste: (liste '("Text" 3 5))
Aufgabe 5: Greife auf die 5 zu.
Liste: (liste '(1 2 3 4 5 6 7 8 9))
Aufgabe 6: Greife auf (5 6 7 8 9) zu.
Liste: (liste '((a b c (1 2 3) x y) "Text" "Gimp"))
Aufgabe 7: Greife auf "Text" zu.
Liste: (liste '((a b c (1 2 3) x y) "Text" "Gimp"))
Aufgabe 8: Greife mit nur zwei Funktionen auf die 1 zu.
Lösungen:
Aufgabe 1: (car liste) Aufgabe 2: (car (cdr liste)) ODER (cadr liste) Aufgabe 3: (car (cdr (cdr liste))) ODER (caddr liste) Aufgabe 4: (cdr (cdr (cdr liste))) ODER (cdddr liste) Aufgabe 5: (cdr (cdr liste)) ODER (cddr liste) Aufgabe 6: (cdr (cdr (cdr (cdr liste)))) ODER (cddddr liste) Aufgabe 7: (car (cdr liste)) ODER (cadr liste) Aufgabe 8: (caar (cdddar liste))
Wieso sind Listen wichtig? Ganz einfach, jeder Rückgabewert einer GIMP-Funktion wird als Liste zurückgegeben, egal ob es nur ein Wert oder mehrere sind. Da bei einem Skript für GIMP GIMP-Funktionen nicht ganz unwichtig sind, musst du dieses Thema wirklich verstanden haben.
| << Variablen | ^ Inhaltsverzeichnis ^ | Funktionen >> |
