Ausdrücke - dialogos-project/dialogos GitHub Wiki

(diese Seite auf Englisch)

DialogOS bietet an vielen Stellen die Möglichkeit, Ausdrücke zu verwenden, um komplexe Gegebenheiten und Operationen darzustellen, beispielsweise in Ausgabeknoten und Bedingungen. In den folgenden Abschnitten wird gezeigt, welche Ausdrücke es gibt und welche Verwendungszwecke sie haben können.

Datentypen

DatentypenAusdrücke bestehen meist aus Operatoren und Variablen. Die Möglichkeiten der Verwendung von Operatoren sind unter anderem abhängig von den Datentypen der verwendeten Variablen. Außerdem ergibt sich der Datentyp eines Ausdrucks wiederum aus den verwendeten Operatoren und Variablen. DialogOS verwendet folgende Datentypen:

bool
Mit dem Datentyp bool lassen sich die beiden Wahrheitswerte true (wahr) und false (falsch) darstellen. Jedes Ergebnis einer logischen Operation hat den Typ bool.

int
int dient der Darstellung ganzzahliger Werte wie beispielsweise 1, 312, -21.

real
real dient der Darstellung von reellen Zahlenwerten mit dem "." als Dezimaltrennzeichen wie beispielsweise 3.141, -2.8, 5.0.

string
Mit dem Datentyp string lassen sich Zeichenketten darstellen. Der Wert eines Strings ist eine Zeichenkette, die am Anfang und am Ende mit einem Anführungszeichen gekennzeichnet wird wie beispielsweise "DialogOS", "Hallo", "".

list
Mit dem Datentyp list lassen sich Listen von Daten darstellen, wobei der Datentyp eines jeden Listeneintrags beliebig ist. Es ist also insbesondere möglich Listen von Listen zu erstellen. Der Wert einer Liste wird am Anfang und am Ende mit eckigen Klammern gekennzeichnet und Elementwerte mit Komma separiert wie beispielsweise [0,1,2]. Die leere Liste wird durch den Ausdruck [ ] repräsentiert. Einzelne Elemente der Liste können mit liste[index] gelesen und zugewiesen werden. (Allerdings funktionieren --/++/+=... nicht). Zusätzlich können Listen mit dem CONS-Operator (::) konstruiert werden, 0::1::2::[] (allerdings nur Listen, es ist nicht möglich, beliebige Paare zu konstruieren).

struct
Der Datentyp struct dient der Darstellung von Mengen von Daten, bei denen jedes Element eine Bezeichnung hat. Der Wert einer Struktur wird am Anfang und am Ende mit Mengenklammern gekennzeichnet und ihre Elemente mit Komma separiert. Jedes Element ist eine Wertzuweisung der Form "name=wert". Die leere Struktur wird durch den Ausdruck { } repräsentiert. Ein Beispiel für verschachtelte Strukturen und Listen: { eins=1, zwei=2 }, { zahlen={ eins=1}, buchstabe="a" }. Elemente können über ihre Namen mit Punkt-Notation angesprochen (gelesen/geschrieben) werden (struct.zahlen.eins=1), wobei auf diese Weise keine Elemente hinzugefügt werden können. Sie können ebenfalls über eckige Klammern angesprochen werden und hierüber ist ebenfalls das hinzufügen möglich: struct["name"] = "otto".

Jede Variable kann unabhängig von ihrem Datentyp den Wert undefined annehmen.

Ausdrücke und Operatoren

Ein einfacher Ausdruck ist eine Variable oder ein (konstanter) Wert, der mit einem Datentyp dargestellt werden kann, z.B.: meineNeueVariable, true, false, undefined, [undefined, 1, 3.1], { zahlen=[0,1,2,3], buchstaben= { latin=[a,b,c] } }, [[0,1],[1,0]].

Komplexe Ausdrücke bestehen aus Variablen oder konstanten Werten, die durch Operatoren miteinander verbunden sind. Ausdrücke können nach Belieben geklammert werden, um die Auswertungsfolge festzulegen. Werden Operationen nicht besonders geklammert, so sind sie im Allgemeinen linksassoziativ. Komplexe Ausdrücke können beliebig tief ineinander geschachtelt werden.

Für Ausdrücke, deren Wert eine Zahl ist, gibt es einen unären Operator -, der den Wert invertiert, und für Wahrheitswerte den Operator !, der aus true false macht und umgekehrt. Das Ergebnis dieser Operatoren hat den gleichen Typ wie ihre Operanden.

Weiterhin gibt es folgende binären Operatoren:

+
Der Operator + dient bei der Verwendung von Zahlen als Addition. Dies gilt immer dann, wenn rechter und linker Operand Ausdrücke sind, die entweder zum Datentyp real oder zu int ausgewertet werden. Das Ergebnis hat den gleichen Datentyp wie die beiden Operand. Ferner ist es möglich, int- und real-Werte miteinander zu addieren, wobei das Ergebnis dann einen real-Wert liefert und string-Werte mit string-, int- oder real-Werten zu addieren, wobei das Ergebnis dann einen string-Wert liefert, indem die Zeichen des rechten Operanden dem linken Operanden rechts angefügt wurden.

-
Der Operator - dient der Subtraktion von Zahlen. Er subtrahiert, analog zum Additionsoperator, int- und real-Werte. Bei der Verwendung anderer Datentypen kommt es zu einem "Type error".

*
Der Operator * dient der Multiplikation von Zahlen. Er multipliziert, analog zu den anderen arithmetischen Operatoren, int- und real-Werte und wirft einen "Type error" bei der Verwendung anderer Datentypen.

/
/ dividiert analog zu den anderen arithmetischen Operatoren Zahlen. Er wirft außerdem eine "/ by zero"-Fehlermeldung, wenn der rechte Operand die Null ist.

%
% liefert den Rest einer Ganzzahl-Division. In DialogOS funktioniert er neben int-Werten auch mit real-Werten, wobei der rechte Operand dann gerundet wird.

::
Der Operator :: konkateniert ein Element beliebigen Typs mit einer Liste. Der linke Operand wird also einer Liste, die vom rechten Operanden bezeichnet wird, an vorderster Stelle angefügt. Die Operation ist rechtsassoziativ und liefert daher beispielsweise für den Ausdruck x::y::[] das Ergebnis [x,y].

<, >, <=, >=
Die Operatoren <, >, <= und >= entsprechen den mathematischen Relationen mit den gleichen Symbolen. Beide Operanden müssen den gleichen Typ, int oder real, haben. Das Ergebnis dieser Operation ist immer vom Typ bool.

==
Der Operator == prüft seine Operanden auf Gleichheit. Die Operanden können jeden beliebigen Typ haben, unter der Voraussetzung, dass beide Operanden einen Wert des gleichen Typs ausdrücken. Der Operator liefert true, wenn beide Operanden den gleichen Wert besitzen, ansonsten false.

!=
Der Operator != entspricht der Negation der Gleichheit. Dieser Operator funktioniert analog zu ==, evaluiert aber zu false, wenn beide Operanden den gleichen Wert besitzen, ansonsten true.

&&
Der Operator && entspricht der logischen Konjunktion. Mit ihm lassen sich zwei bool-liefernde Ausdrücke miteinander verbinden, wobei && dann true liefert, wenn beide Operanden zu true ausgewertet wurden, ansonsten false.

||
Der Operator || entspricht der logischen Disjunktion. Mit ihm lassen sich zwei bool-liefernde Ausdrücke miteinander verbinden, wobei || dann true liefert, wenn mindestens einer der beiden Operanden zu true ausgewertet wurde, ansonsten false.

Es gibt genau einen tenären Operator, nämlich ? :. Er überprüft den linken Operanden auf seinen Wahrheitswert und gibt dann den mittleren Ausdruck zurück, wenn der Wahrheitswert true ist oder den rechten Ausdruck, wenn der Wahrheitswert false ist. Der Operator ? : ist rechtsassoziativ.

Neben den allgemeinen Operatoren für Ausdrücke, gibt es noch weitere so genannte Zuweisungsoperatoren, bei denen der linke Operand eine Variable und der rechte Operand ein Ausdruck ist, der zum gleichen Datentyp ausgewertet wird wie die Variable. Diese Operatoren sind rechtsassoziativ und existieren in folgender Form:

=
Der Operator = weist dem linken Operanden den Wert des Ausdrucks auf der rechten Seite zu.

+=, -=
Die Operatoren += bzw. -= weisen dem linken Operanden den Wert der Variable zuzüglich bzw. abzüglich dem Wert des rechten Operanden zu. Es gelten die Typeinschränkungen der Operatoren + und -.

*=, /=, %=
Die Operatoren *=, /=, %= weisen dem linken Operanden den Wert der Variable multipliziert, dividiert oder "kongruent modulo" mit dem Wert des rechten Operanden zu. Es gelten die Typeinschränkungen der Operatoren *, / und %.

Weitere Operatoren

Neben den vorgestellten gängigen Operatoren erlaubt DialogOS auch das Benutzen von einigen Abkürzungen und bitweise Operatoren:

++, --
Die Prä- und Postfixe ++ und -- bewirken angewandt auf Variablen oder Konstanten, deren Datentyp eine Zahlendarstellung ist, dass der Wert der Variable um 1 (bzw. 1.0) erhöht oder gesenkt wird. Sie dienen also auch als Zuweisungsoperatoren. Der Unterschied zwischen Postfix- und Präfix-Anwendung ist der, dass Präfixe vor dem Rest des Ausdrucks ausgewertet werden und Postfixe danach. Ist eine Variable a gleich 0, so gilt z.B. a=3+(a++) =\> a=3, aber a=3+(++a) =\> a=4.

&
Der binäre Operator & ist das bitweise Und für Zahlen.

|
Der binäre Operator | ist das bitweise Oder für Zahlen.

^
Der binäre Operator ^ ist das bitweise exklusive Oder für Zahlen.

Jeder Funktionsaufruf lässt sich auch als Ausdruck verstehen, wobei der Datentyp des Ausdrucks dem Rückgabetyp der Funktion entspricht und die Parameter innerhalb der Funktionsdefinition festgelegt werden. Die Syntax on Funktionen sowie die vordefinierten Funktionen werden im Kapitel Funktionen und Skripte ausführlich beschrieben.

Außerdem gibt es die Möglichkeit, Werte aus einer Struktur in Form eines Ausdrucks Strukturname.Label zu erhalten, wenn der Datentyp des Strukturelements bekannt ist. Beispielsweise erhält man bei einer Struktur struct={ eins=1, zwei=2 } durch den Ausdruck struct.eins den Wert von 'eins', nämlich 1.

Nächste Seite: Muster

⚠️ **GitHub.com Fallback** ⚠️