Skript-Fu-Einstieg: Funktionen
Aus GIMPForum
| << Listen | ^ Inhaltsverzeichnis ^ | Das "Rezept" >> |
Globale Definitionen und Funktionen
In den letzten zwei Kapiteln hast du gelernt, wie du Variablen und Listen definierst. Du hast auch gelernt, dass diese nur innerhalb der let*-Funktion verwendbar sind; sowas nennt man lokale Variable. Das Gegenteil einer lokalen wäre eine globale Variable. Also eine Variable, die während es gesamten Skripts aufgerufen werden kann. Eine globale Variable wird so deklariert:
(define Variable 0)
So erstellst du eine globale Variable mit dem Namen Variable und dem Wert 0. Du kannst das ganze auch mal in der Skript-Fu-Konsole GIMPs ausprobieren.
Schreibe zuerst (define name 5) und bestätige mit Enter. Als Rückgabewert erhältst du den Namen der Variable, in unserem Fall also name. Nun tippst du (print name) ein und bestätigst wieder mit Enter. Als Rückgabewert solltest du jetzt 5 erhalten.
Die Definition globaler Funktionen sollte nun klar sein... ist ja auch nicht so schwierig.
Variablen wirst du aber eher selten global definieren, du solltest das sogar unterlassen, da das als unschöner Programmierstil gilt.
Neben Variablen gibt es aber auch noch Funktionen. Eine Funktion ist (meistens!), eine Abfolge von mehreren Befehlen, die unter einem Namen gespeichert werden. Hier ein kleines Beispiel einer Funktion, die das Quadrat einer Zahl ausrechnet und dieses dann durch 2 teilt:
(define (quadrat/2 zahl)
(set! zahl
(* zahl zahl)
)
(set! zahl
(/ zahl 2)
)
(print zahl)
zahl
)
Und kürzer so:
(define (quadrat/2 zahl)
(/ (* zahl zahl) 2))
Funktionen werden, genau wie Variablen, auch definiert. Und du wirst in jedem Skript für GIMP mindestens eine globale Funktion benutzen.
Die Definition einer globalen Funktion (lokale Funktionen werden hier nicht besprochen um Verwirrung zu vermeiden) ist etwas komplexer als die einer globalen Variable.
Zuallererst wird auch der Ausdruck define verwendet um überhaupt etwas zu definieren. Danach kommt in Klammern der Funktionsname gefolgt von allen Parametern.
Parameter: Ein Parameter ist ein Wert, der an eine Funktion übergeben wird. Die Anzahl der Werte, die übergeben werden müssen sind von der Funktion festgelegt. In der Funktion selbst haben diese Parameter dann wieder eigene Namen, um sie voneinander unterscheiden zu können.
Im Beispiel oben ist zahl der einzige Parameter, der an die Funktion übergeben werden kann. In der Funktion selbst, wird zahl dann zuerst mit sich selbst multipliziert, anschließend durch 2 dividiert und zum Schluss ausgegeben. Als Nebeneffekt drucken wir das Resultat noch ab (print)!
Nach der Angabe des Namens und der Parameter kommt, das was die Funktion macht.
Am besten schauen wir das mal an einem konkreten Beispiel an:
Schreibe (define (mittelwert a b) (/ (+ a b) 2)) in die Konsole und bestätige;
Als Rückgabewert erhält man dann mittelwert, den namen der gerade definierten Funktion.
Nun tippst du (mittelwer 5 10) ein und solltest als Ergebnis 7.5 erhalten.
Du hast nun die Funktion mittelwert erstellt, welche zwei Werte, a und b benötigt. Diese beiden Werte werden dann in der Funktion summiert und durch 2 geteilt und das ist auch gleich der Rückgabewert der Funktion selbst.
In der ScriptFu-Konsole sieht es so aus:
> (define (mittelwert a b) (/ (+ a b) 2)) mittelwert > (mittelwert 5 10) 7.5
Fuer Fortgeschrittene eine komplizierteres Beispiel (daher interessanter!) ScriptFu-console:
> (define mittelwert
(lambda (x . y) (let* (
(liste (cons x y))
(lengte (length liste)))
(/ (apply + liste) lengte))))
mittelwert
> (mittelwert 1 2 3 4 5)
3
An mittelwert wird eine (unbenannte) Funktion gebunden die mindestens einen Parameter hat. Das macht der Ausdruck (lambda (x . y) .... Danach werden alle Parameter zu einer Liste zusammengefügt, gleich danach die Länge der Liste berechnet (mit length) und schließlich wird + auf die Liste losgelassen (apply) für die Summe aller Elemente in der Liste und schließlich durch die Anzahl der Elemente geteilt um den Mittelwert von mehreren Zahlen (mindestens einer!) als Resultat abzuliefern.
Ich hoffe, dass dieser Teil des Tutorials trotz allem nicht zu kompliziert für dich war. Ansonsten bitte ich dich, mir zu melden, was du denn nicht verstanden hast, damit ich das überarbeiten kann. --Mohi 01:20, 16. Nov 2008 (CET)
Den theoretischen Teil dieses Tutorials hast du geschafft. Falls du manche Themen noch nicht zu 100% verstanden hast, solltest du einfach mal weiter machen. Häufig wird einem etwas erst wirklich klar, wenn man es selbst gemacht hat.
Was man sich vor dem Skripten überlegen sollte und dann kommt das Spannendste am ganzen Tutorial: das Schreiben des Skripts.
| << Listen | ^ Inhaltsverzeichnis ^ | Das "Rezept" >> |
