Funktionen und Skripte - dialogos-project/dialogos GitHub Wiki

(diese Seite auf Englisch)

In diesem Kapitel wird beschrieben, wie die Skriptsprache von DialogOS, die in Skriptknoten und eigenen Funktionen verwendet wird, aufgebaut ist. In dem ersten Abschnitt wird allgemein beschrieben welche Befehle es gibt, in einem weiteren Abschnitt Bedingungen und Schleifen und schließlich in einem letzten Abschnitt Hilfsfunktionen, die DialogOS zur Verfügung stellt, um Datenzugriffe zu vereinfachen.

Statt in der DialogOS-eigenen Skriptsprache kann man Skripte auch in Groovy schreiben.

Ein Skript lässt sich als Folge von Befehlen verstehen, die von oben nach unten abgearbeitet wird. Eine Funktion besteht aus einem Funktionskopf, der Rückgabetyp, Funktionsname und Parameter in der genannten Reihenfolge enthält, und einem Funktionskörper, der wie ein Skript aufgebaut ist und mit Mengenklammern vor dem ersten und nach dem letzten Befehl gekennzeichnet wird. Dabei werden die beliebig vielen Parameter als Ausdruck der Form (Typ1 Name1, Typ2 Name2,...) hinter den Funktionsnamen geschrieben. Ist der Rückgabetyp nicht void ("nichts"), so muss die Funktion Werte zurückliefern.

Die Syntax für eine Funktion sieht also wie folgt aus: Rückgabetyp Funktionsname(Parameter) { Funktionskörper }, konkret z.B. int Summe(int a, int b) { return a+b; }, wobei die Parameter a, b und der Rückgabewert a+b Ausdrücke des Datentyps int sind.

Allgemeine Befehle

In der Skriptsprache von DialogOS gibt es einige häufig gebrauchten Standardbefehle, die alle mit einem Semikolon am Ende gekennzeichnet werden. Die folgende Liste gibt einen Überblick über diese Befehle:

Deklarationen:
Eine Deklaration beschreibt die Erstellung neuer Variablen. Sie besteht aus dem Datentyp und dem Namen der neuen Variable. Bei einer Deklaration könenn Sie optionaler Weise, durch ein Gleichheitszeichen abgetrennt, auch den Wert angeben, den die neue Variable annehmen soll. Hier drei Beispiele für Deklarationen:

struct neueStruktur;

real pi = 3.141;

struct kompletteStruktur = { datum={wochentag="montag", monat="mai"}, wochentage=["montag", "dienstag", "mittwoch"] };

Alle Deklarationen müssen vor den weiteren Anweisungen des Skripts stehen. (Ausnahme: Indexvariable in For-Schleifen, siehe unten.)

Zuweisungen:
Jeder Variable, die im selben Skriptabschnitt deklariert oder in DialogOS festgelegt wurde, kann ein neuer Wert zugewiesen werden. Dies funktioniert mit den Zuweisungsoperatoren =, +=, -=, /= und *=. Auch die Verwendung der Post- und Präfixe ++ und -- bei Variablen lässt sich als Zuweisungsbefehl verstehen, beispielsweise entspricht a = a+1; den Befehlen a += 1; und a++; bzw. ++a;.

Rückgabe:
Innerhalb von Funktionen ist es wichtig, dass am Ende ein Wert zurückgegeben wird, der dem festgelegten Rückgabetyp entspricht. Dies gilt für alle Datentypen außer void. Eine Rückgabeanweisung besteht immer aus dem Befehl return und einem anschließenden Ausdruck, der zu einem Wert des Datentyps ausgewertet wird. Bei void beschränkt sich die Anweisung auf den return-Befehl. Eine Rückgabe sieht also beispielsweise wie folgt aus:

return 3.141;

return a+b;

return;

Bedingungen und Schleifen

Funktionen BefehleDialogOS bietet die Möglichkeit der Verwendung von Bedingungen und Schleifen, um Kontrolle darüber zu geben, wann bzw. wie oft ein Befehl ausgeführt werden soll. Es gibt folgende Varianten von Bedingungen und Schleifen:

break:
Mit dem Befehl "break;" wird erreicht, dass der aktuell ausgeführte Block verlassen und bei denen Befehlen danach weitergearbeitet wird. Dies ist insbesondere in Schleifen und switch-Anweisungen sinnvoll.

if-then-else:
Eine if-then-else-Konstruktion besteht in DialogOS aus einem Kopf der Form if(Ausdruck), wobei der Ausdruck zu einem Wahrheitswert true oder false ausgewertet wird, und einem anschließenden Block von Befehlen, die ausgeführt werden, wenn der Ausdruck wahr war. Optional kann mit dem Schlüsselwort else hinter dem Befehlsblock ein weiterer Block von Befehlen spezifiziert werden, die ausgeführt werden, wenn der Ausdruck der Bedingung nicht wahr war. Es ist zu beachten, dass die Befehlsblöcke mit Mengenklammern umschlossen werden. Hat ein Befehlsblock nur einen Befehl, so sind die Klammern allgemein optional.

Beispiel:

if(x!=0) { x=0; } else { x++; }

switch:
Eine switch-Konstruktion bietet die Möglichkeit, einen einzelnen Ausdruck auf verschiedene Werte hin zu überprüfen und Befehlsfolgen nur bei Übereinstimmungen oder Nicht-Übereinstimmungen auszuführen. Ein switch wird typischerweise wie folgt konstruiert:

switch(Ausdruck) { case Wert: { Anweisungen break; } case Wert2: ... default: { Anweisungen break; }

Ein Befehlsblock wird nun ausgeführt, sobald der davor stehende Wert mit dem des Ausdrucks übereinstimmt. Es ist sinnvoll, einen Break am Ende jedes Befehlblocks zu verwenden, da sonst alle Anweisungsblöcke nach der ersten Übereinstimmung ausgeführt werden würden. Der Befehlsblock mit dem Schlüsselwert default wird in jedem Fall ausgeführt, wenn die switch-Konstruktion nicht vorher durch einen break verlassen wurde.

while-Schleife:
Eine while-Schleife ist eine Schleife, die einen Befehlsblock enthält, der so oft ausgeführt wird, bis die Bedingung der Schleife nicht mehr erfüllt ist. Dies kann insbesondere auch dann auftreten, wenn die Bedingung vor dem ersten Durchlauf schon nicht erfüllt ist. Die Schleife besteht aus dem Kopf while(Ausdruck) und einem Befehlsblock. Der Ausdruck muss zu einem der beiden Wahrheitswerte true oder false auswertbar sein. Beispiel:

fak= 1; 
while(zahl\>1) fak \*= zahl--;

do-while-Schleife:
Eine do-while-Schleife ist eine Schleife, die analog zur while-Schleife, einen Befehlsblock enthält, der so oft ausgeführt wird, bis die Bedingung nicht mehr erfüllt ist. Allerdings wird die Schleife mindestens einmal durchlaufen. Syntaktisch unterscheidet sie sich von der while-Schleife dadurch, dass der Kopf selbst nur aus dem Schlüsselwort do besteht und die Anweisung while(Ausdruck) erst nach dem Befehlsblock erscheint. Jene wird hier durch ein Semikolon zusätzlich markiert. Beispiel:

fak = 1; 
do { fak\*= zahl--; } while(zahl\>1);

for-Schleife:
Eine for-Schleife ist eine Schleife, die es erlaubt, einzelne Befehle aus dem Befehlsblock einer Schleife mit in den Kopf zu integrieren. Der Kopf besteht aus drei Teilen: einer Initialisierung, einer Bedingung und einer Anweisung, die nach Abarbeitung des Befehlblocks ausgeführt wird. In der Initialisierung kann eine Deklarationen oder Zuweisung stehen. In dem Anweisungsteil dagegen nur eine Zuweisung. Beispiel:

for(int fak = 1; zahl\>1; fak \*= zahl--);

Wenn der Befehlsblock hinter dem Schleifenkopf leer ist, muss ein Semikolon hinter den Kopf gesetzt werden, damit der Folgebefehl nicht zur Laufzeit als Teil des Befehlsblocks interpretiert wird.

Hilfsfunktionen in DialogOS

DialogOS stellt folgende eingebaute Funktionen zur Verfügung, die innerhalb von eigenen Funktionen und Skriptknoten verwenden werden können. Manche Funktionen können Argumente von beliebigem Datentyp verwenden; dies ist unten durch 'a gekennzeichnet.

int abs(int i)
Gibt den absoluten Wert einer Zahl i zurück.

struct addDate(struct date, struct addition)
Berechnet die Summe aus date und addition. date muss ein volle Datumsstruktur wie folgt sein: {day:int, month:int, year:int}, addition muss nicht alle Datenfelder haben. Jahre werden zuerst addiert, danach Monate und dann Tage.

Beispiele:

{ day=10, month=6, year=2003 } + { day=25 } = { day=5, month=7, year=2003 }
{ day=10, month=6, year=2003 } + { day=25, month=1 } = { day=4, month=8, year=2003 }

list append(list l1, list l2)
Gibt eine neue Liste aus l1 und l2 konkateniert zurück.

string charAt(string s, int index)
Gibt den Buchstaben an der Stelle index in einem String s zurück.

list concat(list lists)
Gibt eine neue Liste bestehend aus allen Listen in lists konkateniert zurück.

list cons('a v, list l)
Gibt eine neue Liste zurück, in der v vor alle Elemente aus l gestellt ist.

bool contains(list list, 'a v)
Gibt zurück, ob v in list enthalten ist.

bool contains(string s, string infix)
Gibt zurück, ob infix in s enthalten ist.

bool contains(struct str, string key)
Gibt zurück, ob eine Struktur str das Label key beinhaltet.

struct currentDate()
Gibt das momentane Datum als Struktur der Form { day:int, month:int, year:int } zurück.

struct currentTime()
Gibt die momentane Uhrzeit als Struktur der Form { h:int, m:int } zurück.

int currentTimeMillis()
Gibt den genauen Zeitabstand zwischen der momentan Uhrzeit und der um Mitternacht am 1. Januar 1970 in Milisekunden zurück.

struct currentWeekDay()
Gibt den momentanen Wochentag und die Kalenderwoche als Struktur der Form { day:int, week:int } zurück. Wochentage beginnen bei 0: 0=Sonntag, 1=Montag, ...

bool empty(list l)
Gibt zurück, ob eine Liste l leer ist.

bool endsWith(string s, string postfix)
Gibt zurück, ob s mit postfix endet.

list enumerate(int start, int end, int interval)
Gibt eine Liste mit allen Zahlen zwischen der von start und end aus, mit einem jeweiligen Abstand von interval.

void error(string e)
Wirft eine Fehlermeldung mit dem Text von e.

real exp(real r)
Gibt die Euler'sche Zahl mit einer Potenz von r zurück.

'a get(list l, int index)
Gibt das Element an der Stelle index einer Liste l zurück

'a get(struct str, string key)
Gibt das Element von str mit dem Label key zurück oder undefined, falls key nicht in str enthalten ist.

'a head(list l)
Gibt das erste Element (den Kopf) einer Liste l zurück.

int indexOf(list list, 'a v)
Gibt die Position von v in list zurück oder -1, falls v nicht in list enthalten ist.

int indexOf(string s, string infix)
Gibt die Position von infix in s zurück oder -1, falls infix nicht in s enthalten ist.

bool isInt(string s)
Gibt zurück, ob s zum Typ int konvertiert werden kann.

bool isReal(string s)
Gibt zurück, ob s zum Typ real konvertiert werden kann.

list keys(struct str)
Gibt eine Liste zurück, die alle Labels von str enthält.

int length(list l)
Gibt die Anzahl der Elemente von l zurück.

int length(string s)
Gibt die Länge eines Strings s zurück.

struct loadProperties(string directory, string filename)
Liest eine Property-Datei mit dem Dateinamen filename aus dem Verzeichnis directory und gibt deren Inhalt als Struktur zurück.

real log(real r)
Gibt den natürlichen Logarithmus einer Zahl r zurück.

struct member(list list, 'a v)
Äquivalent zu contains(list, v)

struct merge(struct str1, struct str2)
Gibt eine neue Struktur zurück, die sich aus einer Zusammenfügung von str1 und str2 ergibt.

Die Parameter-Strukturen werden nicht abgeändert. Stattdessen wird eine neue Struktur erstellt und zurückgegeben. Wenn str1 und str2 das gleiche Label beinhalten, so bestimmt sich das Ergebnis aus dem Typ der untergeordneten Werte. Sind die Werte von zwei Elementen aus str1 und str2 selbst Strukturen, so werden diese Unterstrukturen rekursiv zusammengefügt. Ansonsten wird der Wert von str2 übernommen.

Beispiele:

merge({ x=3, y=4 }, { x=4, z=5 }) = { x=4, y=4, z=5 }
merge({ x={x=3}, y={a=4} }, { x={y=4}, y=5 }) = { x={x=3, y=4}, y=5 }

struct mergeDefined(struct str1, struct str2)
Gibt eine neue Struktur zurück, die sich aus einer Zusammenfügung von str1 und str2 ergibt. Im Gegensatz zu merge werden allerdings nur Werte von str1 übernommen, wenn sie in str2 nicht den Wert undefined haben.

int parseInt(string s)
Konvertiert s zu einem Wert mit dem Typ int. Gibt undefined zurück, falls die Konvertierung fehlschlägt.

real parseReal(string s)
Konvertiert s zu einem Wert mit dem Typ real. Gibt undefined zurück, falls die Konvertierung fehlschlägt.

print('a v)
Gibt eine String-Repräsentation von v auf der Kommandozeilen-Ebene (stdout) zurück.

printf(string a, ...)
Gibt alle übergebenen Argument aus, im Format a.

struct put(struct str, string a, 'a x)
Gibt eine Struktur zurück, die str entspricht und zusätzlich ein Element a mit dem Wert x enthält. Falls die Struktur str a bereits enthält, wird der Wert überschrieben.

int random(int min, int max)
Gibt einen Zufallswert aus dem geschlossenen Interval von min und max zurück.

list remove(list list, list remove)
Gibt eine Liste zurück, die alle Elemente aus list abzüglich derer aus remove enthält.

string replace(string s, string a, string b)
Gibt eine Kopie von s zurück, in der alle Vorkommen von a durch b ersetzt wurden.

list reverse(list list)
Gibt eine Kopie von list in umgedrehter Form zurück.

int round(real r)
Rundet r zum nächstliegenden Wert des Typs int.

list set(list l, int index, a element) Setzt das Element der Liste l an Stelle index auf a und gibt die resultierende Liste zurück (wobei auch das Original überschrieben wird).

void showDialog(string s)
Zeigt ein kleines Fenster in dem der String s angezeigt wird. Der Dialog wird fortgesetzt sobald der Benutzer OK gedrückt hat.

void sleep(int millis) Unterbricht die Skript-Ausführung für millis Millisekunden, genauso wie ein separater "Warten"-Knoten.

list sort(list list)
Gibt eine sortierte Liste mit dem gleichen Inhalt wie die Liste list zurück. Alle Elemente von list müssen dabei vom gleichen Typ sein.

bool startsWith(string s, string prefix)
Gibt zurück, ob der String s mit prefix beginnt.

string str('a s)
Konvertiert ein beliebiges Element s zu einem String.

list stripSpecialCharacters(list list)
Nimmt als Input eine Liste list von Strings und gibt eine Liste zurück, die die gleichen Elemente enthält, allerdings ohne Zeichen, die keine Buchstaben oder Zahlen sind.

list sublist(list list, int offset)
Gibt die Teilleiste von list zurück, die an der Stelle offset beginnt.

list sublist(list list, int offset, int length)
Gibt diejenige Teilliste von list zurück, die an der Stelle offset beginnt und die Länge length hat.

string substring(string s, int offset)
Gibt den Teilstring von s zurück, der an der Position offset beginnt.

string substring(string s, int offset, int length)
Gibt denjenigen Teilstring von s zurück, der an einer Position offset beginnt und die Länge length hat.

list tail(list l)
Gibt den "Rest" (tail) einer Liste l zurück, der entsteht, wenn das erste Element weggelassen wird.

string toLowerCase(string s)
Gibt eine Kopie von s zurück, in der alle Buchstaben zu Kleinbuchstaben konvertiert wurden.

string toUpperCase(string s)
Gibt eine Kopie von s zurück, in der alle Buchstaben zu Großbuchstaben konvertiert wurden.

list values(struct str)
Gibt eine Liste mit allen Werten aus str zurück.

Nächste Seite: Fortgeschrittene Features