Zum Forum
Passwort vergessen?
Noch keinen Account?
lexikon
Hauptseite
Zufälliger Artikel
Diskussion
Diskussion : REXX
Links
Forum
Portale
Reisen
Versicherung
Inhaltsverzeichnis
Hauptmenü
Home
Editorial
Bildung
E-Learning
Fremdsprachen
Magazin
Wissen
Wörterbücher
Enzyklopädien
Expertendienste
Wissenswertes
Praktische Ratgeber
--------------------------
Biologie
Chemie
Computer
Film/ Theater
Geografie
Geschichte
Jura
Kunst
Literatur
Mathematik
Medizin
Musik
Philosophie
Physik/ Astronomie
Politik
Psychologie
Religionen
Sport
Umwelt
Wirtschaft
Reisen
Lexikon
Versicherung
Suchen
Schnellsuche
Suchmaschinen
Metasuchmaschinen
Webkataloge
News
Treffpunkt
Chat
Forum
Suche
Schnellsuche
Sitemap
Kontakt
Impressum
REXX
Stichpunkte
Allgemein
REXX (Abk. f
Restructured Extended Executor) ist eine von Mike Cowlishaw bei IBM entwickelte Skriptsprache. Inhaltsverzeichnis showTocToggle("Anzeigen"
"Verbergen") 1 Herkunft 2 Grundlegende Konzepte 2.1 Alles ist ein String 2.2 Auswertungslogik 3 Die universelle Schleife 3.1 begrenzte Anzahl von Wiederholungen 3.2 Zähl-Schleife 3.3 While-Schleife 3.4 Until-Schleife 3.5 Endlosschleife (mit optionaler Abbruchbedingung) 3.6 iterate und leave 4 Arrays und Stems 5 flexible Variablen 6 Das negative Beispiel 7 Übersicht der REXX-Anweisungen (unvollständig) 8 Übersicht der REXX-Funktionen (unvollständig) 9 Übersicht der REXX-Operatoren (unvollständig) 9.1 Vergleichsoperatoren 9.2 sonstige Operatoren 10 Fehler- und Ausnahmebehandlung in REXX 10.1 Literatur 10.2 Weblinks [Bearbeiten]
Herkunft
VM/CMS (bzw. später VM/ESA))
REXX stammt aus dem Großrechnerbereich (TSO
wurde aber auch in anderen Produktlinien wie OS/2 verwendet
da beinahe jedes wichtige Programm damit "fernsteuerbar" ist
Eine angepasste Version – genannt ARexx – erfreute sich auch auf dem Amiga großer Beliebheit
Mittlerweile sind auch Interpreter für fast alle Umgebungen bis hin zum PalmOS erhältlich
1996 wurde REXX zum ANSI-Standard (ANSI X3.274-1996 "Information Technology - Programming Language REXX")
indem DLLs zum eigentlichen Interpreter hinzugeladen werden
REXX kann besonders leicht erweitert werden
Datenbank-
Socket- und System-Funktionen verfügbar
Insbesondere unter OS/2 ist eine Vielfalt solcher Bibliotheken mit mathematischen
die wie normale REXX Funktionen angesprochen werden können
aber auf IBM Großrechnern sind auch REXX-Compiler verfügbar. [Bearbeiten]
REXX ist in der Regel eine interpretierte Sprache
Grundlegende Konzepte
[Bearbeiten]
Alles ist ein String
die Zeichenkette 200
In klassischem Rexx (im Unterschied zum hier nicht behandelten
Zahlenwerte mit String-Manipulationen zu ändern und das Ergebnis sofort wieder als Zahl zu verwenden: a = 2 a = a || '00' say a / 2 Durch Anhängen zweier Nullen wird a mit 100 "multipliziert"; das Ergebnis
jedoch kompatiblen Objektorientieren Rexx) ist jeder Wert ein String -- auch Zahlen! Es ist also ohne weiteres möglich
kann sofort wieder als Zahl verwendet werden
Ausgegeben wird 100
Folgerichtig ist die Arbeit mit Strings in Rexx sehr einfach
Die obige Verkettungsoperation hätte auch a = a'00' geschrieben werden können
wenn das Ergebnis eine Zahl ist
Ein oder mehrere Leerzeichen zwischen a und '00' hingegen hätten dazu geführt
dass bei der impliziten Verkettung ein Leerzeichen eingefügt worden wäre -- was sicher unerwünscht ist
die vorliegenden Wert als Zahl zu interpretieren: say ' 1' + 2 gibt tatsächlich 3 aus! Im Normalfall rechnet Rexx auf 9 Dezimalstellen genau; durch Angabe einer höheren Anzahl kann jedoch fast beliebig genau gerechnet werden
Wenn eine Zahl benötigt wird
weil der verwendete Operator mit Zahlen arbeitet
versucht Rexx
dass diese wenig hardwarenahe Methode Rexx nicht unbedingt als Sprache für sehr rechenintensive Probleme prädestiniert. [Bearbeiten]
Es liegt nahe
Auswertungslogik
Rexx wurde u. a. entwickelt
um auf einfache Weise Kommandos an eine Umgebung absetzen zu können
die Rexx-Programme unempfindlich gegenüber neu eingeführten Schlüsselwörtern macht und ein Alleinstellungsmerkmal der Sprache sind: 1
Dies wird unterstützt durch die folgende Strategie bei der Auswertung einer Anweisung
weil der zuzuweisende Wert = 1 eben kein gültiger Ausdruck ist
die der Variablen IF den Wert 1 zuweist! Hingegen wäre if == 1 zwar ein gültiger logischer Ausdruck
Wenn das zweite Token mit einem Gleichheitszeichen beginnt
handelt es sich um eine Wertzuweisung Hieraus folgt
dass z. B. if = 1 eine gültige Anweisung ist
ob die Variable if exakt den Wert 1 hat; als eigenständige Anweisung ergibt sie jedoch einen Syntaxfehler
der prüft
2I
um Prozeduren und Funktionen zu realisieren; diese notiert man in Rexx nach dem "ausführbaren Teil" des ProgrammsB
handelt es sich um eine Marke Marken werden benötigt
st das zweite Token ein Doppelpunkt
eispiel: say: funk('dir x') exit funk: return Arg(1) Man könnte erwarten
dass dir x zur Standardausgabe ausgegeben wirdD
as Schlüsselwort say fungiert hier jedoch nur als Marke; der Ausdruck funk('dir x') bildet schon die nächste AnweisungG
emäß Regel 4 (siehe unten) wird also funk aufgerufen und dir x zur Ausführung an die Umgebung übergeben. (Es ginge natürlich auch ohne die Funktion funk; dies nur als sehr einfaches Beispiel für einen Funktionsaufruf) Es ist auch möglich
mit signal value Ausdruck eine bestimmte Marke anzusteuern; dies ist eher unüblich und nur in bestimmten Fällen sinnvoll
z. B. als Alternative zu sehr großen select-Anweisungen3
say
erfolgt die Auswertung entsprechend dieser Schlüsselwortanweisung Solche Schlüsselwörter sind z. B. if
Wenn das erste Token ein Schlüsselwort ist
do
ohne dass existierende Programme überarbeitet werden müssen: sowohl Variablen als auch Marken können ihren Namen behalten! 4
dass diese Regel Rexx sehr zukunftssicher macht: Zukünftige Versionen der Sprache können neue Schlüsselwörter einführen
Man beachte
so ist ihr Wert DIR (ihr Name in Großbuchstaben)
OS/2...) den Inhalt des aktuellen Verzeichnisses ausgibt: dir oder auch: 'dir' Im ersten Fall ist dir eine Variable; wurde ihr kein Wert zugewiesen
In jedem anderen Fall wird die Anweisung als Ausdruck ausgewertet und das Ergebnis an die Umgebung übergeben Dies bedeutet
und es wird DIR an die Umgebung übergeben und ausgeführt
Windows
dass die folgende Rexx-Anweisung (unter DOS
Im zweiten Fall wird garantiert dir übergeben und ausgeführt
dass eine zukünftige Rexx-Version ein Schlüsselwort dir einführt
Es könnte natürlich sein
dass die Anweisung als Ausdruck (Verkettung mit dem Leerstring) erkannt wird. [Bearbeiten]
Um sicherzugehen
dass das Programm auch dann noch funktioniert
kann z. B. durch ''dir erzwungen werden
Die universelle Schleife
Im Gegensatz zu anderen Programmiersprachen beginnen bei REXX alle Schleifen mit do
Die Gestaltung dieser do-Schleife kann sehr vielfältig sein
dann lassen sie sich diese zu einem do-end-Block zusammenfassen: do Anweisung1 Anweisung2 Anweisung3 . . . AnweisungN end [Bearbeiten]
Wenn man eine feste Folge von Anweisungen braucht (z. B. für den then- oder else-Teil einer bedingten Anweisung)
begrenzte Anzahl von Wiederholungen
Soll eine Schleife eine fest vorgegebene Anzahl durchlaufen werden
dann kann man hinter dem do einen Ausdruck angeben
der die Anzahl der Wiederholungen bestimmt (Beispiel): do 5 say "Hallo" end Es wird fünfmal "Hallo" ausgegeben [Bearbeiten]
Zähl-Schleife
do index=start to ende by schrittweite say index end Die Zählvariable darf nach dem abschließenden end wiederholt werden; stimmt die hier angegebene Variable nicht
so wird ein Syntaxfehler ausgelöst: do index=start to ende by schrittweite say index end index Dies ist eine gute Hilfe
um in verschachtelten Schleifen den Überblick zu bewahren. [Bearbeiten]
While-Schleife
(Bedingung wird am Schleifenanfang abgefragt und muss ein Ausdruck sein
der den Wert 0 oder 1 ergibt) i=0; do while Bedingung i=i+1 say i end [Bearbeiten]
Until-Schleife
(Bedingung wird am Schleifenende abgefragt) i=11 do until Bedingung i=i-1 say i end [Bearbeiten]
Endlosschleife (mit optionaler Abbruchbedingung)
do forever if Abbruchbedingung then leave end [Bearbeiten]
iterate und leave
Zur Verwendung in Schleifen gibt es die speziellen Sprunganweisungen iterate und leave
während leave die Schleife verlässt (vergleichbar break)
Beispiel: do index=1 if index == 3 then iterate index if index > 5 then leave say index end index Dabei springt iterate zum Schleifenanfang (vergleichbar dem continue anderer Programmiersprachen)
Die Angabe der Zählvariable ist wieder optional; sie ermöglicht außerdem die Steuerung verschachtelter Schleifen
Im Beispiel wird ausgegeben: 1 2 4 5 [Bearbeiten]
Arrays und Stems
REXX ist sehr flexibel
REXX kennt keine expliziten Variablendeklarationen
und auch keine Arrays
zahl.3 = 7 ..
dass Variablen indiziert werden: do i = 1 to 10 zahl.i = 10 - i end zahl.0 = i - 1 /* => 10; per Konvention */ do i = 1 to zahl.0 say i')' zahl.i end i Danach existieren folgende Variablen mit folgender Zuordnung: zahl.1 = 9
zahl.2 = 8
Dennoch lässt sich eine arrayähnliche Struktur leicht dadurch erzeugen
Per Konvention wird unter dem Index 0 die Anzahl der gespeicherten Elemente abgelegt
Mit drop zahl. können dann alle elf Variablen der Form zahl.i mit einem Schlag entfernt werden
Diese Art der Variablen wird als Stem-Variablen bezeichnet; der erste Teil einschließlich des ersten Punkts wird als Stem bezeichnet
der Rest als Tail
die durch Punkte voneinander getrennt werden; auf diese Weise können auch mehrdimensionale Arrays realisiert werden
Der Tail kann auch aus mehreren Symbolen bestehen
Die Werte der verwendeten Symbole können beliebig sein; sie sind durchaus nicht auf Zahlen beschränkt
z. B.: Option. = 0 Option.0verbose = 1 say Option.0ther /* => 0 */ Im Tail wurden hier absichtlich Konstanten gewählt
Durch Wertzuweisung an den Stem kann eine Gruppe zusammengehöriger Variablen initialisiert werden
dass eine im Tail verwendete Variable einen Wert zugewiesen bekommt. [Bearbeiten]
dass sich keine Fehler einschleichen dadurch
die mit einer Ziffer beginnen und die damit unabänderlichen Werte 0VERBOSE und 0THER haben; damit ist sichergestellt
flexible Variablen
So kann auch eine Variable
schaltet man die entsprechende Ausnahmebehandlung ein: signal on novalue [Bearbeiten]
dass unbemerkt auf Variablen zugegriffen wird
die vorher ohne Zuweisung als Wort verwendet wurde
denen kein Wert zugewiesen wurde
nach der Zuweisung mit diesem Wert benutzt werden: do say hallo => HALLO hallo = 25 say hallo => 25 hallo = "say 5 + 3" say hallo => say 5 + 3 interpret hallo => 8 drop hallo say hallo => HALLO end Wenn vermieden werden soll
Das negative Beispiel
Auch REXX hat eine zum GOTO äquivalente Anweisung: SIGNAL
Richtig angewendet ein sehr nützlicher Befehl; zum Beispiel dann
wenn man Fehler oder andere Ausnahmesituationen abfangen will
schlecht bis gar nicht nachvollziehbaren Quell-Text erzeugen: /* Ein Rexx-Programm */ signal definieren; ausgabe: say a signal ende; definieren: a = "hello world" signal ausgabe; ende: exit [Bearbeiten]
Aber man kann damit auch unleserliche
Übersicht der REXX-Anweisungen (unvollständig)
die nichts macht pull variable liest eine Zeichenkette von der Tastatur ein pull eingabe say ausdruck ausdruck wird auf dem Bildschirm ausgegeben say "Hallo Welt!" signal label Äquivalent zu goto label [Bearbeiten]
REXX-Anweisungen address umgebung ausdruckzum Ausführen von Anweisungen außerhalb der REXX-Umgebung address DOS 'DIR *.*' call prozedur Aufruf einer prozedur call binkoeff n k call load 'bibliothek' Eine externe Bibliothek laden call load 'mathe.r' cls löscht den Bildschirm do Alle möglichen Arten von Schleifen drop variable variable löschen drop a exit veranlasst das Programm sich zu beenden if bedingung then anweisungSelektionsbefehlif a > 0 then a = a + 1 interpret ausdruck ausdruck wird wie eine REXX-Anweisung behandelt interpret "a=5*(4+b)" leave Verlassen einer Schleife nop Leeranweisung
Übersicht der REXX-Funktionen (unvollständig)
REXX-Funktionen address() gibt die Umgebung zurück z.B: address() == 'DOS' arg(1) Enthält die Eingabe aus der Kommandozeile console = arg(1) charin("dateiname") holt ein Zeichen aus dem Eingabestrom zeichen = charin("semmel.txt") charout() schreibt ein Zeichen in den Ausgabestrom chars() gibt die Anzahl der noch verfügbaren Zeichen im Eingabestrom aus date() Funktion Datum gibt je nach Option Tages bzw
wert) gibt das n.te Wort des String aus a = word("polyglotte Katze"
eumel) lines() gibt die Anzahl der noch vollständigen Zeilen im Eingabestrom aus Stringfunktionen length(string) liefert die Länge eines Strings zurück substr(string
Datumsangaben zurück. linein("dateiname") Liest eine ganze Zeile aus einer Datei ein zeile = linein("semmel.txt") lineout("dateiname"
2) words(string) gibt die Anzahl der Wörter des Strings aus a = words("Hallo Leute") mathematische Funktionen abs(zahl) liefert den vorzeichenlosen Teil einer Zahl zurück bitand() Bitweises UND bitor() Bitweises ODER bitxor() Bitweises XOR random(u
zeichenzahl) Ein Teilstring aus string word(string
ausdruck) ausdruck wird in Datei geschrieben linout("semmel.txt"
o und s sind optional C2D() Wandelt Zeichen in ASCII-Code (dezimal) um C2X() Wandelt Zeichen in ASCII-Code (hexadezimal) um D2C() Wandelt Dezimalzahlen in Zeichen um D2X() Wandelt Dezimalzahlen in Hexadezimalzahlen um [Bearbeiten]
position
s) liefert eine zufällige Zahl in den Grenzen von u und o zurück. u
o
Übersicht der REXX-Operatoren (unvollständig)
[Bearbeiten]
Vergleichsoperatoren
Rexx verfügt über zwei Klassen von Vergleichsoperatoren
die exakt (z. B. ==) oder numerisch (=) vergleichen
Im zweiten Fall werden zunächst etwaige Rand-Blanks entfernt
weil diese für die Interpretation als Zahl nicht von Bedeutung sind
Rexx unterstützt eine große Zahl von Varianten
wie in manchen Sprachen üblich
durch das Ausrufungszeichen
ersatzweise den Backslash ausgedrückt wird (das Ausrufungszeichen gehört zum Zeichenvorrat für Bezeichner!) Vergleichs-Operatoren Beispiel Ergebnis exakt gleich == "1 " == 1 0 numerisch gleich = "1 " = 1 1 nicht exakt gleich ¬== == numerisch ungleich <> ¬= = exakt größer >> 30 >> "4 " 0 numerisch größer > 30 > "4 " 1 exakt größer oder gleich >== ¬<< << numerisch größer oder gleich >= ¬< < exakt kleiner << 30 << "4 " 1 numerisch kleiner < 30 < "4 " 0 exakt kleiner oder gleich <== ¬>> >> numerisch kleiner oder gleich <= ¬> > [Bearbeiten]
sondern durch das mathematische Zeichen für „nicht“ (¬)
wobei allerdings „nicht“ nicht
sonstige Operatoren
* und / werden nicht extra aufgeführt. REXX-Operatoren ** Potenz 4**3 = 64 %ganzzahlige Division 11%3 = 3 // Rest-Operator (Modulo) 11//3 = 2 & logisches UND a & b => wahr
Die Operatoren +
wenn entweder a oder b wahr ist
wenn a und b wahr sind | logisches ODER a | b => wahr wenn a oder b wahr ist && logisches XOR a && b => wahr
-
aber nicht beide gleichzeitig || Stringverkettung (Konkatenation) "bär"||"tiger" = "bärtiger" [Bearbeiten]
Fehler- und Ausnahmebehandlung in REXX
Es gibt in REXX die Möglichkeit
mit SIGNAL Fehler abzufangen und mit Ausnahmezuständen umzugehen
Es gibt dazu die fünf System-Labels ERROR
HALT
FAILURE
NOVALUE und SYNTAX
Sie können im Quellcode während des Ablaufs an- und ausgeschaltet werden
aber als Fehler der ausführenden Umgebung (z. B. das externe Kommando konnte nicht gefunden werden)
SIGNAL Beispiel: signal on halt; a = 1 do a = (a + 1) // 10000 say a end halt: say "Das Programm wurde vom Benutzer abgebrochen" exit error Bei der Ausführung eines externen Kommandos ist ein Fehler aufgetreten (RC ist <> 0) failure dto.
der noch kein Wert zugewiesen wurde syntax Syntaxfehler Durch Zusatz von name Label kann eine spezielle zu verwendende Sprungmarke angegeben werden
Ist keine separate Behandlung für FAILUREs aktiv
sondern kann gezielt eingesetzt werden
die die Anzahl der Tage des übergebenen Monats zurückgibt: Tage: signal on syntax name Tage.Syntax signal value 'TAGE.'Arg(1) Tage.2: return 28 + Schaltjahr(Arg(2)) Tage.4: return 30 Tage.6: return 30 Tage.9: return 30 Tage.11: return 30 Tage.syntax: return 31 Ein Syntaxfehler muss also keineswegs das Ende des Programms herbeiführen
wie in dieser Funktion
so werden diese ggf. wie ERRORs behandelt. halt Programmabbruch durch Benutzer-Interaktion novalue lesender Zugriff auf eine Variable
Nach Ende der Funktion (d. h. der Ausführung von return) ist wieder der ursprüngliche Status der Behandlung von Syntax-Exceptions aktiv
Wenn ein Abbruch durch Fehler oder Benutzer mittels signal on Bedingung umgeleitet wurde
kann mittels der Systemvariablen RC und SIGL der Fehler analysiert werden
in der dieser Fehler aufgetreten ist
RC beinhaltet den Fehlercode von REXX und SIGL die Zeile
CALL Das Schlüsselwort call kann (neben dem Aufruf von Prozeduren) ebenfalls zur Behandlung von Exceptions verwendet werden; allerdings nicht aller: Syntax und Novalue können nur per signal behandelt werden
Tritt die jeweilige Exception auf
so wird zur angegebenen Marke verzweigt; nach Ausführung von return) wird an der Stelle danach fortgesetzt
TRACE TRACE bestimmt die Ablaufverfolgung des Programms
TRACE kennt die folgenden Schalter: A
E
C
N
O
I
F
L
R und S
" 15 Ungültige hexadezimale Konstante 38 Ungültige Schablone oder Muster 16 Marke nicht gefunden 39 Auswertungsstapel-Überlauf 17 Unerwartete PROCEDURE 40 Inkorrekter Routinenaufruf 18 THEN erwartet 41 Schlechte Arithmetik-Umformung 19 Kette oder Symbol erwartet 42 Arithmetischer Überlauf/Unterlauf 20 Symbol erwartet 43 Routine nicht gefunden 21 Ungültige Daten am Ende der Klausel 44 Die Funktion gab keine Daten zurück 22 Ungültige Zeichenkette 45 Bei der Funktion Return sind keine Daten angegeben 24 Ungültige TRACE-Anforderung 48 Ausfall im Systemservice 25 Ungültiges Unter-Schlüsselwort gefunden 49 Interpretationsfehler [Bearbeiten]
Fehlercodes RC - Code: Bedeutung: RC - Code: Bedeutung: 4 Programmunterbrechung 26 Ungültige ganze Zahl 5 Ressourcen erschöpft 27 Ungültige DO Syntax 6 Unpaarige Zeichen "/*" 28 Ungültiges LEAVE oder ITERATE 7 WHEN oder OTHERWISE erwartet 29 Umgebungsname zu lang 8 Unerwartetes THEN oder ELSE 30 Name oder Kette zu lang 9 Unerwartetes WHEN oder OTHERWISE 31 Name beginnt mit Nummer oder . 10 Unerwartetes oder unpassendes END 33 Ungültiges Ausdrucksergebnis 11 Steuerstapel voll 34 Logischer Wert nicht 0 oder 1 12 Klausel zu lang 35 Ungültiger Ausdruck 13 Ungültige Zeichen im Programm 36 Unpaariges ")" 14 Unvollständiges DO/SELECT/IF 37 Unpaariges "(" oder unerwartetes "
Literatur
ISBN 0137806515 [Bearbeiten]
The Rexx Language: A Practical Approach to Programming
von Michael Cowlishaw
Weblinks
eine REXX-Variante zum Schreiben von Java-Programmen in REXX-Syntax (http://www.ibm.com/technology/NetRexx/) REXX für Palm OS (http://www.jaxo.com/rexx/index.html) REXX/400 Programmers Guide (http://publib.boulder.ibm.com/iseries/v5r2/ic2924/books/c4157280.pdf) REXX/400 Reference (http://publib.boulder.ibm.com/iseries/v5r2/ic2924/books/c4157290.pdf) en:REXX fr:Rexx ru:REXX
Regina
eine Open Source Implementierung für Unix und Windows (http://regina-rexx.sourceforge.net/index.html) NetRexx
[X] Schliessen
Dieser Artikel basiert auf dem Artikel
REXX
aus der freien Enzyklopädie
wikipedia
und steht unter der
GNU Lizenz für freie Dokumentation
. In der wikipedia ist eine
Liste der Autoren
verfügbar.
Rekursion
Rekursives Akronym
Rüsseltiere
Römisch-katholische Kirche
Rekursives Akronym
Regenerativ
Riptor/Artikel
Schweden
[ Zurück ]
Inhalt Lexikon:
A
B
C
D
E
F
G
H
I
J
K
L
M
N
O
P
Q
R
S
T
U
V
W
X
Y
Z
1
2
3
4
5
6
7
8
9
Chat
|
Lexikon
|
Reisen
|
Versicherung
|
Forum
|
Kontakt