... REDUCE type( [let_exp]
INIT {x1 = rhs1}|{<x1> = wrexpr1}|{x1|<x1> TYPE dtype1} {x2 = rhs2}|{<x2> = wrexpr2}|{x2|<x2> TYPE dtype2}
... FOR for_exp1 FOR for_exp2 ...
NEXT ... {x1 = rhs1}|{<x1> = wrexpr1} {x2 = rhs2}|{<x2> = wrexpr2}
... ) ...
Wirkung
Ein Konstruktorausdruck mit dem Reduzierungsoperator
REDUCE erzeugt ein Resultat eines mit type angegebenen Datentyps aus einem oder mehreren
Iterationsausdrücken. Für type kann angegeben werden:
Wenn der an einer Operandenposition benötigte Datentyp eindeutig und vollständig erkennbar ist, wird dieser verwendet.
Wenn der Operandentyp nicht vollständig erkennbar ist, wird außer bei Übergabe
des Konstruktorausdrucks an einen Aktualparameter mit generisch typisiertem Formalparameter der immer erkennbare Typ der ersten Deklaration hinter INIT verwendet.
Wenn der Konstruktorausdruck an einen Aktualparameter mit generisch typisierten Formalparameter übergeben wird, wird der Operandentyp nach
speziellen Regeln abgeleitet.
Die Parameter und Argumente des Konstruktorausdrucks sind wie folgt anzugeben:
Als erstes kann ein optionaler LET-Ausdruck
zur Definition lokaler Hilfsfelder angegeben werden, deren Wert innerhalb des Ausdrucks verwendet aber nicht mehr geändert werden kann.
Danach muss ein Zusatz INIT gefolgt von beliebig vielen Deklarationen
angegeben werden. Die Deklarationen hinter INIT erzeugen lokale Variablen
x1, x2, ... oder Feldsymbole <x1>,
<x2>, ..., für die bezüglich Namensraum und Sichtbarkeit
das Gleiche gilt wie für die Hilfsfelder, die in einem LET-Ausdruck deklariert werden. Die Syntax der Deklaration ist entweder
genauso wie in einem LET-Ausdruck und sie folgt den dortigen Regeln
oder es können mit dem Zusatz TYPE initiale Variablen oder Feldsymbole des angegebenen Datentyps dtype angelegt werden.
Es muss mindestens eine Variable oder ein Feldsymbol deklariert werden. Die hinter INIT
deklarierten Variablen oder Feldsymbole sind nur hinter NEXT verwendbar. Insbesondere können sie nicht für die Deklaration anderer Variablen oder Feldsymbole verwendet werden.
Die erste Variable x1 bzw. des erste Feldsymbols <x1>
bestimmt das Ergebnis des Ausdrucks und der Datentyp muss in den Ergebnistyp type konvertierbar sein.
Alle weiteren hinter INIT deklarierten Variablen oder Feldsymbole sind
optionale weitere Hilfsfelder, die anders als die hinter LET deklarierten auf der linken Seite von Zuweisungen hinter NEXT stehen können.
Danach muss mindestens einer und es können mehrere direkt aufeinanderfolgende beliebige
Iterationsausdrücke
mit FOR angegeben werden.
Bei der Verwendung bedingter Iterationen wird das Ergebnis in frei definierbaren Iterationsschritten erzeugt.
Bei der Verwendung von Tabelleniterationen werden Zeilen vorhandener interner Tabellen ausgewertet. In diesem Fall spricht man von
Tabellenreduzierungen, da beliebige Werte aus den Zeilen vorhandener interner Tabellen konstruiert werden.
Danach müssen hinter NEXT Zuweisungen angegeben werden, die für
jede Iteration des letzten FOR-Ausdrucks einmal ausgeführt werden.
Allen hinter INIT deklarierten Variablen und Feldsymbolen muss dabei ein
Wert bzw. ein Speicherbereich zugewiesen werden. Bei strukturierten Variablen oder Feldsymbolen genügt eine Zuweisung an eine ihrer Komponenten.
Die Zuweisung der rechten Seiten rhs an Variablen x
erfolgt nach den Regeln einer normalen Zuweisung mit dem Zuweisungsoperator
=, d.h. für rhs können alle dort möglichen Aufrufe und Ausdrücke angegeben werden.
An ein Feldsymbol kann nur das Ergebnis eines
schreibbaren Ausdruckswrexp zugewiesen werden. Dabei gilt das Gleiche wie für die Zuweisung
schreibbarer Ausdrücke mit
ASSIGN, d.h. es dürfen nur die dort aufgeführten Ausdrücke angegeben werden.
Die Zuweisungen können in beliebiger Reihenfolge aufgeführt werden und die Auswertung
erfolgt von links nach rechts. Jede hinter INTIT deklarierte nicht strukturierte
Variable bzw. Feldsymbol darf genau einmal als linke Seite angegeben werden. Bei strukturierten Variablen
bzw. Feldsymbolen darf entweder die gesamte Struktur oder jede Komponente einmal als linke Seite angegeben
werden. An den Operandenpositionen der rechten Seiten können neben den Datenobjekten des Programms
alle hinter dem letzten FOR-Ausdruck sichtbaren lokalen Variablen und Feldsymbole des Ausdrucks verwendet werden:
alle hinter LET deklarierten Variablen und Feldsymbole
alle hinter INIT deklarierten Variablen und Feldsymbole
die durch die FOR-Ausdrücke versorgten wa1,
wa2, ... bzw. <fs1>, <fs2>,
.... Dadurch besteht Zugriff auf den Inhalt der Zeilen der internen Tabellen zur Konstruktion des Ergebnisses.
Alle nicht hinter INTIT deklarierten Hilfsfelder dürfen nur an Lesepositionen der rechten Seiten angegeben werden.
Nach Abschluss der gesamten Auswertung wird der Inhalt der ersten Variable x1 bzw. des Speicherbereichs, auf welchen das erste Feldsymbol <x1> zeigt, nach den
Zuweisungsregeln dem temporären Resultat des Ausdrucks vom Typ type zugewiesen.
Hinweise
Die Bezeichnung des Operators REDUCE erklärt sich wie folgt:
Bei der Verwendung bedingter Iterationen werden in der Regel Mengen von Datenobjekten in ein einzelnes Datenobjekt reduziert.
Bei der Verwendung für mit Tabelleniterationen für
Tabellenreduzierungen
wird der Inhalt der beteiligten internen Tabellen in aller Regel in einen zusammenfassenden Wert reduziert.
Der Ergebnistyp ist zwar beliebig und muss nicht weniger komplex als die beteiligten internen Tabellen sein, was aber nur in Ausnahmefällen ausgenutzt werden sollte. Für die Konstruktion von Tabellen aus Tabellen sind
Tabellen-Comprehensions die bequemere Alternative.
Bei der Verwendung eines lokalen Feldsymbols <xi> auf der linken
Seite von Zuweisungen hinter NEXT ist zu beachten, dass es sich wie bei
INIT und LET nicht um Zuweisungen an den vom Feldsymbol referenzierten
Wert handelt, sondern dass das Feldsymbol wie mit der Anweisung ASSIGN gesetzt wird.
Anders als bei Tabellen-Comprehensions
mit dem Wertoperator VALUE
werden bei der Zuweisung eines REDUCE-Ausdrucks an eine Struktur oder eine
interne Tabelle diese nicht vor der Verarbeitung der FOR-Ausdrücke vollständig überschrieben und können im gesamten Ausdruck direkt verwendet werden.
Wenn an der ersten Position hinter INIT eine Variable deklariert wird
und auf der rechten Seite der VALUE-Operator mit dem Zeichen #
angegeben ist, wird für dieses falls möglich der Ergebnistyp type des REDUCE-Ausdrucks übernommen.