In diesem Kapitel werden folgende Themen behandelt:
Die folgende Tabelle gibt eine Übersicht der Operatoren:
Typ des Ausdrucks: | Priorität* | gültig für |
---|---|---|
expr1 and expr2 | 2 | logical **, integer (bitwise and) |
expr1 or expr2 | 1 | logical **, integer (bitwise or) |
expr1 + expr2 | 4 | real, integer, string *** |
expr1 - expr2 | 4 | real, integer, string *** |
expr1 << expr2 | 4 | integer (bitshift) |
expr1 >> expr2 | 4 | integer (bitshift) |
expr1 * expr2 | 5 | real, integer *** |
expr1 / expr2 | 5 | real, integer *** |
expr1 ** expr2 | 5 | real, integer *** |
expr1 in expr2 | 3 | rechter Operand Gruppe |
- expr | 6 | real, integer |
expr1 < expr2 | 3 | real, integer, string, date *** |
expr1 ⇐ expr2 | 3 | real, integer, string, date *** |
expr1 = expr2 | 3 | integer, string, date, real**** *** |
expr1 >= expr2 | 3 | real, integer, date, string *** |
expr1 > expr2 | 3 | real, integer, date, string *** |
expr1 != expr2 | 3 | real, integer, date, string, logical *** |
not expr | 6 | logical, integer (bitwise not) |
(expr) | 7 | all |
function() | 7 | siehe Kapitel "Vordefinierte Funktionen" auf Seite 5-1, Online-Hilfe . AQL-Funktionen für Objekte, . AQL-Funktionen für Aktionen, . Values . Systemattribute |
* Die bei der Spalte "Priorität" angegebene Zahl bezeichnet die Stärke der Bindung der Operanden an den Operator. Je höher die Zahl, desto stärker die Bindung. Steht ein Operand zwischen zwei Operatoren, so wird zuerst die Operation mit der stärkeren Bindung, bzw. der höheren Priorität ausgeführt. Haben benachbarte Operatoren die gleiche Priorität, so erfolgt die Abarbeitung von links nach rechts.
** Bei den logischen Ausdrücken and und or wird der zweite Operand nur dann bearbeitet, wenn es notwendig
ist. Das ist der Fall bei:
true and <expression2>
false or <expression2>
*** Der Typ des Ergebnisses ist bei Operanden verschiedenen Typs der Tabelle "Ergebnisse gemischter Arithmetik" auf Seite 3-18 zu entnehmen.
**** Da die Prüfung auf Gleichheit bei real-Werten intern mit der maximalen Genauigkeit ausgeführt wird, ist es empfehlenswert, auf die Gleichheit innerhalb einer bestimmten Toleranz abzufragen.
Beispiel 9: priority.aql
[true or nix ] nl;
[false and nix ] nl;
[3-2-1] nl;
[3-(2-1)] nl;
[1+2*3] nl;
[2<<2-1] nl;
[32>>2-1] nl;
[32>>2**2-1] nl;
[(32>>2)**2-1] nl;
[1+2**2*3] nl;
true
false
63
13
Die folgende Tabelle zeigt die Ergebnisse gemischter Arithmetik:
+ - * / ** | erster Operand | |||
zweiter Operand | real | integer | string | group |
real | real | invalid | invalid | nur +, - |
integer | real | integer | invalid | nur +, - |
string | invalid | invalid | nur +, - * | nur +, - |
group | invalid | invalid | invalid | nur +, - ** |
object | invalid | invalid | invalid | nur +, - |
* (concat, substring)
** (siehe "Ausdrücke mit Gruppen" )
Es wird nicht geprüft, ob bei integer und real der Wertebereich überschritten wird (overflow).
Beispiel 10: mixed_arit.aql
[3/2;;f3] nl;
[3/2*1.0;;f3] nl;
[3.0/2;;f3] nl;
["Mein Hut der hat "+"drei Ecken"] nl;
001
1.000
1.500
Mein Hut der hat drei Ecken
Die folgende Tabelle zeigt die Ergebnisse gemischter Vergleiche:
< > ⇐ >= = != |
real | integer | string | logical | date |
real | logical | logical * | ** | ** | ** |
integer | logical * | logical | invalid | ** | ** |
string | ** | ** | logical | ** | ** |
logical | ** | ** | ** | ** | ** |
date | ** | ** | ** | ** | logical |
* Das Ergebnis des real-Ausdrucks wird vor dem Vergleich durch Abschneiden der Dezimalstellen in eine Integer umgewandelt. Falls dabei ein Bereichsüberlauf auftritt, wird "invalid" als Ergebnis zurückgeliefert.
** Vergleich ist nur für die Vergleichsoperatoren "=" und "!=" zulässig.
= Bei einem Vergleich, bei dem nur ein Wert "invalid" ist, ist das Ergebnis immer der logische Wert
"false". Sind beide Werte "invalid", so hat das Ergebnis den logische Wert "true".
!= Bei einem Vergleich, bei dem nur ein Wert "invalid" ist, ist das Ergebnis immer der logische Wert
"true". Sind beide Werte "invalid", so hat das Ergebnis den logischen Wert "false".
Folgende Operatoren für Zeichenketten können verwendet werden:
+ Verkettung von Zeichenketten (concatenation)
PROGRAMM: | AUSGABE: |
---|---|
var string; | |
string = "inhalt " | |
delimiter = "mit Begrenzungszeichen \"" | |
[string+delimiter] nl | inhalt mit Begrenzungszeichen " |
[string+(delimiter-"* Begrenzungszeichen*")] nl | inhalt mit " |
Folgende Attribute können für Gruppen verwendet werden:
.first | Dieses standardmäßig für jede Gruppe definierte Attribut liefert als Ergebnis das erste Gruppenelement. |
.tail | Dieses immer vorhandene Attribut jeder Gruppe liefert eine Gruppe mit allen Gruppenelementen außer dem ersten Element (Komplement zu .first). |
.el_* | Dieses Attribut liefert das n-te Element der Gruppe. Damit kann gezielt auf einzelne Gruppenelemente zugegriffen werden (Arrays in anderen Programmiersprachen). |
or | Ergebnis ist eine Gruppe, die alle Elemente der beiden beteiligten Gruppen enthält. Es wird dabei gewährleistet, daß in der Ergebnisgruppe kein Element doppelt auftritt. |
* | Ergebnis ist eine Gruppe, die nur die Elemente enthält, welche in beiden beteiligten Gruppen enthalten sind. |
- | Ergebnis ist eine Gruppe, die nur die Elemente enthält, welche jeweils nur in einer der beiden beteiligten Gruppen enthalten sind. |
+ | Die als linker Operand angegebene Gruppe bzw. das angegebene Gruppeneinzelelement wird um das nach dem Zeichen + angegebene Symbol erweitert. Falls es sich dabei um eine Gruppe handelt, werden beide Gruppen addiert (concatenation). Es wird nicht geprüft, ob das Ergebnis ein Element doppelt enthält. Falls es sich um ein Einzelement handelt, wird es je nach Schreibweise am Anfang oder Ende der Gruppe eingehängt. |
in | Falls der erste Operand in der als zweiter Operand aufgeführten Gruppe enthalten ist, hat der Ausdruck den logischen Wert "true", andernfalls "false". |
where | Dieser Operator verbindet eine Gruppe mit einem logischen Ausdruck. Ergebnis sind alle Elemente, die diese Bedingung erfüllen. Voraussetzung ist, daß jedes Element bezüglich seines Typs in diese Bedingung eingesetzt werden kann. In der Bedingung wird das zu untersuchende Gruppenelement durch einen Punkt dargestellt. Soll ein Attribut des zu untersuchenden Gruppenelements geprüft werden, wird es mit .<attributname> angegeben. |
sort by | Nach dem Operator sort by wird das Sortierkriterium angegeben. Dabei wird das Gruppenelement oder ein Attribut davon in der gleichen Form notiert wie im logischen Ausdruck der where-Bedingung. Das Sortierkriterium kann durch folgende Schlüsselworte näher spezifiziert werden: asc aufsteigende Sortierung (Voreinstellung) desc absteigende Sortierung |
and group | Mit diesem Schlüsselwort werden Untergruppen von allen Elementen mit gleichem Attributwert gebildet. Es ist möglich, mehrere Sortierkriterien durch Komma getrennt anzugeben. Bei der Kombination mit where muß where den Sortierkriterien vorangestellt werden. |
select from | Mit diesem Schlüsselwort kann aus einer Gruppe attributgesteuert eine andere Gruppe erzeugt werden Syntax: <group> = select <attribute> from <group_expression> |
An Funktionen zur Behandlung von Gruppen stehen zur Verfügung:
len ( ) | Ermitteln der Elemente einer Gruppe (siehe Kapitel "Stringlänge – len") |
index ( ) | Ermitteln eines Gruppenelements (siehe Kapitel "Ermitteln eines Gruppenelements bzw. Character aus String – index") |
empty ( ) | Test auf leere Gruppen (siehe Kapitel "Test auf leere Gruppen – empty") |
pos ( ) | Ermitteln des Aufrufwertes eines Gruppenelementes |
PROGRAMM: | AUSGABE: |
---|---|
zahlen = { 1, 2, 3, 4, 5 } | |
gruppen_gruppe = {zahlen, zahlen, zahlen} | |
‘zahlen: ‘ [zahlen] nl | zahlen: { 1, 2, 3, 4, 5 } |
diverses = { 4, "gelb", 2, 34.5, "leicht", false } | |
‘diverses: ‘ [diverses] nl | diverses: { 4, gelb, 2, 34.5, leicht, false } |
gruppe_gesamt = zahlen + diverses | |
‘Erweiterung: ‘ [gruppe_gesamt] nl | Erweiterung: { 1, 2, 3, 4, 5, 4, gelb, 2, 34.5, leicht, false } |
kopf = gruppe_gesamt.first | |
‘Erstes Gruppenelement: ‘ [kopf] nl | Erstes Gruppenelement: 1 |
‘Rest der Gruppe: ‘ [gruppe_gesamt.tail] nl | Rest der Gruppe: { 2, 3, 4, 5, 4, gelb, 2, 34.5, leicht, false } |
‘Durchschnitt: ‘ [zahlen and diverses] nl | Durchschnitt: { 2, 4 } |
‘Differenz 1-2: ‘ [zahlen - diverses] nl | Differenz 1-2: { 1, 3, 5 } |
‘Differenz 2-1: ‘ [diverses - zahlen] nl | Differenz 2-1: { gelb, 34.5, leicht, false } |
‘Bedingung: ‘ [zahlen where . >2 ] nl | Bedingung: { 3, 4, 5 } |
‘Sort aufsteigend: ‘ [zahlen sort by . ] nl | Sort aufsteigend: { 1, 2, 3, 4, 5 } |
‘Sort absteigend: ‘ [zahlen sort by . desc] nl | Sort absteigend: { 5, 4, 3, 2, 1 } |
‘Sort absteigend mit Bedingung: ‘ | |
[zahlen where . > 1 sort by . desc] nl | Sort absteigend mit Bedingung: { 5, 4, 3, 2 } |
‘Einzelelement‘ ‘[zahlen.el_3] nl | Einzelelement: 3 |
‘Gruppe von Gruppen: ‘[gruppen_gruppe] nl | Gruppe von Gruppen: {{1,2,3,4,5} {1,2,3,4,5} {1,2,3,4,5}} |
‘1.Auswahl: ‘[select .first from gruppen_gruppe] nl | 1.Auswahl: {1,1,1} |
◀ Symbole (Variable) | Kontrollanweisungen ▶ |