wikibooks rexx

22
Inhalt Artikel REXX 1 REXX: Einleitung 1 REXX: Variablen 4 REXX: Aus- und Eingabe 5 REXX: Mathematisches und logisches 7 REXX: String ist alles 8 REXX: Anweisungen, Funktionen und Operatoren 10 REXX: Schleifen 11 REXX: Bibliotheken 13 REXX: Beispiele: Primzahlen 15 REXX: Befehlsumfang 16 REXX: Aufgaben 19 REXX: Quellen 19 Referenzen Quelle(n) und Bearbeiter des/der Artikel(s) 20 Artikellizenzen Lizenz 21

Upload: cobitgover

Post on 29-Jun-2015

240 views

Category:

Documents


6 download

TRANSCRIPT

Page 1: WikiBooks REXX

InhaltArtikel

REXX 1REXX: Einleitung 1REXX: Variablen 4REXX: Aus- und Eingabe 5REXX: Mathematisches und logisches 7REXX: String ist alles 8REXX: Anweisungen, Funktionen und Operatoren 10REXX: Schleifen 11REXX: Bibliotheken 13REXX: Beispiele: Primzahlen 15REXX: Befehlsumfang 16REXX: Aufgaben 19REXX: Quellen 19

ReferenzenQuelle(n) und Bearbeiter des/der Artikel(s) 20

ArtikellizenzenLizenz 21

Page 2: WikiBooks REXX

REXX 1

REXX• Einleitung• Variablen• Aus- und Eingabe• Mathematisches und Logisches• String ist alles• Anweisungen, Funktionen und Operatoren• Schleifen• Bibliotheken• Beispiele• Befehlsumfang• Aufgaben• Quellen

REXX: EinleitungREXX (Abk. f. Restructured Extended Executor) ist eine von Mike Cowlishaw bei IBM entwickelte Skriptsprache.Sie sollte (durch Verwendung englischer Wörter) einfach zu lernen sein und es erlauben, möglichst einfachKommandos an eine oder sogar mehrere Umgebungen (z. B. bei Einsatz als Makrosprache in einem Editor, wobeiauch Kommandos an eine Systemshell abgesetzt werden) zu senden.

Grundlegende Konzepte

Alles ist ein StringIn klassischem Rexx (im Unterschied zum hier nicht behandelten, jedoch kompatiblen Objektorientierten Rexx) istjeder Wert ein String – auch Zahlen! Es ist also ohne weiteres möglich, 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, die Zeichenkette 200, kann sofortwieder 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. Ein oder mehrere Leerzeichen zwischen a und '00' hingegen hätten dazu geführt, dassbei der impliziten Verkettung ein Leerzeichen eingefügt worden wäre – was sicher unerwünscht ist, wenn dasErgebnis eine Zahl ist.Wenn eine Zahl benötigt wird, weil der verwendete Operator mit Zahlen arbeitet, versucht Rexx, die vorliegendenWert als Zahl zu interpretieren:

say ' 1' + 2

gibt tatsächlich 3 aus.

Page 3: WikiBooks REXX

REXX: Einleitung 2

Im Normalfall rechnet Rexx auf neun Dezimalstellen genau; durch Angabe einer höheren Anzahl kann jedoch fastbeliebig genau gerechnet werden. Es liegt nahe, dass diese wenig hardwarenahe Methode Rexx nicht unbedingt alsSprache für sehr rechenintensive Probleme prädestiniert.

AuswertungslogikRexx wurde u. a. entwickelt, um auf einfache Weise Kommandos an eine Umgebung absetzen zu können. Dies wirdunterstützt durch die folgende Strategie bei der Auswertung einer Anweisung, die Rexx-Programme unempfindlichgegenüber neu eingeführten Schlüsselwörtern macht und ein Alleinstellungsmerkmal der Sprache sind:1. Wenn das zweite Token mit einem Gleichheitszeichen beginnt, handelt es sich um eine Wertzuweisung

Hieraus folgt, dass z. B.

if = 1

ungeachtet des Schlüsselworts if eine gültige Anweisung ist, die der Variablen IF den Wert 1 zuweist!Hingegen wäre

if == 1

zwar ein gültiger logischer Ausdruck, der prüft, ob die Variable if exakt den Wert 1 hat; als eigenständigeAnweisung ergibt sie jedoch einen Syntaxfehler, weil der zuzuweisende Wert = 1 eben kein gültiger Ausdruck ist.2. Ist das zweite Token ein Doppelpunkt, handelt es sich um eine Marke

Marken werden benötigt, um Prozeduren und Funktionen zu realisieren; diese notiert man in Rexx nach dem„ausführbaren Teil“ des Programms. Beispiel:

say: funk('dir x')

exit

funk: return Arg(1)

Man könnte erwarten, dass dir x zur Standardausgabe ausgegeben wird. Das Schlüsselwort say fungiert hier jedochnur als Marke; der Ausdruck funk('dir x') bildet schon die nächste Anweisung. Gemäß Regel 4 (siehe unten) wirdalso funk aufgerufen und dir x zur Ausführung an die Umgebung übergeben. (Es ginge natürlich auch ohne dieFunktion 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 inbestimmten Fällen sinnvoll, z. B. als Alternative zu sehr großen select-Anweisungen.3. Wenn das erste Token ein Schlüsselwort ist, erfolgt die Auswertung entsprechend dieserSchlüsselwortanweisung

Solche Schlüsselwörter sind z. B. if, do, say. Man beachte, dass die Auswertung der Schlüsselwörter erst an dritterStelle günstig im Hinblick auf zukünftige Erweiterungen ist. Zukünftige Versionen der Sprache können so neueSchlüsselwörter einführen, ohne dass existierende Programme überarbeitet werden müssen, sowohl Variablen alsauch Marken können ihren Namen behalten.4. In jedem anderen Fall wird die Anweisung als Ausdruck ausgewertet und das Ergebnis an die Umgebungübergeben

Dies bedeutet, dass die folgende Rexx-Anweisung (unter DOS, Windows, OS/2, …) den Inhalt des aktuellenVerzeichnisses ausgibt:

dir

oder auch:

'dir'

Page 4: WikiBooks REXX

REXX: Einleitung 3

Im ersten Fall ist dir eine Variable; wurde ihr kein Wert zugewiesen, so ist ihr Wert DIR (ihr Name inGroßbuchstaben), und es wird DIR an die Umgebung übergeben und ausgeführt. Im zweiten Fall wird garantiert dirübergeben und ausgeführt.Es könnte natürlich sein, dass eine zukünftige Rexx-Version ein Schlüsselwort dir einführt. Um sicherzugehen, dassdas Programm auch dann noch funktioniert, kann z. B. durch

''dir

erzwungen werden, dass die Anweisung als Ausdruck (Verkettung der Variablen mit dem Leerstring) erkannt wird;oder man verwendet einfach die Variante, das Kommando als Stringkonstante zu übergeben.

SymbolnamenRexx unterscheidet bei syntaktischen Elementen (Schlüsselwörter und Bezeichner) nicht zwischen Groß- undKleinschreibung; aus Gründen der Lesbarkeit wird hier meist Kleinschreibung bevorzugt. Solange Bezeichnern keinWert zugewiesen wurde, haben sie als impliziten Wert ihren Namen in Großschreibung.Bezeichner dürfen die ASCII-Buchstaben A bis Z (groß und klein), die Dezimalziffern, den Unterstrich, den Punkt,sowie das Frage- und das Ausrufezeichen enthalten; ist das erste Zeichen eine Ziffer oder ein Punkt, handelt es sichum eine Konstante, und eine Zuweisung würde einen Syntaxfehler erzeugen.

StringsStrings dürfen sowohl durch Gänsefüßchen (wie in C) als auch durch Hochkommate (wie in Pascal) begrenztwerden; das Begrenzungszeichen kann enthalten sein, wenn es gedoppelt wird. Stringliterale müssen vor demZeilenende abgeschlossen, können allerdings per Fortsetzungszeichen mit dem Inhalt der nächsten Zeile verkettetwerden. Es gibt keine Variablenersetzung innerhalb von Strings und auch keine mit Backslash codierten Zeichen ('\n'usw.).Folgt nach dem schließenden Begrenzungszeichen der Bezeichner x, so wird der Inhalt als hexadezimaler Codeinterpretiert und darf deshalb nur Hexadezimalziffern und, zur Gruppierung zwecks besserer Lesbarkeit, Leerzeichenenthalten; entsprechend gibt es Binärstrings mit dem Suffix b.

KommentareRexx unterstützt die von C bekannten, durch /* und */ begrenzten Kommentare, die Zeilenumbrüche beinhalten,aber nicht geschachteln werden können.

Page 5: WikiBooks REXX

REXX: Variablen 4

REXX: Variablen

EinleitungDie Programmiersprache REXX kennt keine Typendeklaration.Wenn eine Variable noch keinen Wert zugewiesen bekommen hat, also uninitialisiert ist, verhält sie sich wie ein inGroßbuchstaben geschriebener String:

say hallo => HALLO

Erst mit der Initialisierung ändert sich das:

hallo = 25

say hallo => 25

hallo = "say 5 + 3"

say hallo => say 5 + 3

Durch die Anweisung drop wird eine Variable deinitialisiert und vergessen.

hallo = "Guten Morgen"

say hallo => Guten Morgen

drop hallo

say hallo => HALLO

Werden in REXX Variablen mit Zahlen initialisiert – oder mit Strings, die sich als Zahl interpretieren lassen –, läßtsich mit ihnen rechnen:

a = 25

b = '17'

say a + b => 42

say a - b => 8

say a * b => 425

Um Stringverkettungen vorzunehmen, wird daher ein eigener Operator benötigt:

say a || b => 2517

StemsStems haben in vielerlei Hinsicht Ähnlichkeiten mit Arrays:

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, zahl.3 = 7 ... PerKonvention wird unter dem Index 0 die Anzahl der gespeicherten Elemente abgelegt. Mit drop zahl. könnendann alle elf Variablen der Form zahl.i mit einem Schlag entfernt werden.

Page 6: WikiBooks REXX

REXX: Variablen 5

Nicht jeder Index muß verwendet werden; nicht zugewiesene Variablen belegen keinen Speicherplatz. Der folgendeCode erzeugt ein spärlich besetztes Array:

a = 2

do 5

b = 2*a-1

p.a = b

a = b

end

Nach dem Ablauf existieren folgende Variablen mit folgender Zuordnung: p.2 = 3, p.3 = 5, p.5 = 9, p.9 =17, p.17 = 33.Diese Art der Variablen wird als Stem-Variablen bezeichnet; der erste Teil einschließlich des ersten Punkts wird alsStem bezeichnet, der Rest als Tail. Der Tail kann auch aus mehreren Symbolen bestehen, die durch Punktevoneinander getrennt werden; auf diese Weise können auch mehrdimensionale Arrays realisiert werden. Die Werteder verwendeten Symbole können beliebig sein; sie sind durchaus nicht auf Zahlen beschränkt.

REXX: Aus- und Eingabe

Ausgabe

Ausgabe über den BildschirmWenn man in REXX etwas über den Bildschirm ausgeben will, macht man das über die Anweisung say:

say ausdruck

Der Ausdruck wird zur Standardausgabe ausgegeben.

Ausgabe in eine Dateicall lineout dateiname,ausdruck

Dabei kann als Dateiname 'stderr' für die Standardfehlerausgabe und 'stdout' bzw. der Leerstring '' fürdie Standardausgabe (dann entsprechend der SAY-Anweisung) angegeben werden.

Eingabe

Eingabe über die TastaturDie Eingabe über die Tastatur erfolgt über die Anweisung pull:

pull variable

Strenggenommen ist pull eine Abkürzung für parse upper pull, konvertiert also die Daten in Großschreibung;außerdem kommen die Daten aus der aktuellen Standard-Queue, sofern diese Daten enthält (was allerdingsnormalerweise nicht der Fall ist).

Page 7: WikiBooks REXX

REXX: Aus- und Eingabe 6

Eingabe aus einer Dateivariable=linein(dateiname)

Wenn man sicher gehen will, dass im Eingabestrom noch Zeilen vorhanden sind, kann man die Funktion lines()verwenden:

variable = lines(dateiname)

Der zurückgelieferte Wert gibt an, ob sich noch Zeilen im Eingabestrom befinden (0 oder 1); im Fall der aktuellenStandardqueue ("QUEUE:"), oder wenn das Dateisystem Zeilenangaben unterstützt, kann es sich auch um dieAnzahl handeln.Für den Fall, dass man einzelne Zeichen lesen will, gibt es die zu linein() und lines() analogen Funktionen charin()und chars()

charin(dateiname)

variable = chars(dateiname)

Übergabe bei Start eines REXX-ProgrammsWie bei den meisten Programmiersprachen lassen sich beim Start eines Programms Argumente übergeben. Dieselassen sich mit der parse-arg-Anweisung oder der Funktion arg ermitteln:

/* Ein REXX-Program */

parse arg console /* übergebener Wert nun in der Variablen console */

say

anzahl = words(console)

do index = 1 to anzahl by 1

say word(console,index)

end

Der Aufruf von arg() liefert zurück, ob Argumente angegeben wurden (arg() == 1) oder nicht (arg() == 0); mitarg(1) (anstelle von parse arg) läßt sich der Inhalt des ersten (und bei den meisten Rexx-Interpretern beimAufruf von der Kommandozeile einzigen möglichen) übergebenen Arguments auslesen.

Page 8: WikiBooks REXX

REXX: Mathematisches und logisches 7

REXX: Mathematisches und logisches

Mathematische Grundoperationen• Addieren:

a = 2+3 ==> a == 5

• Multiplizieren:

a = 2*3 ==> a == 6

• Subtrahieren:

a = 2-3 ==> a == -1

• Division:

a = 2 / 3 ==> a == 0.66667

• Potenzieren:Um bn zu berechnen benutzt man b**n

a = 2**3 ==> a == 8

ModuloMan kann nicht alles so teilen, daß gebrochene Zahlen herauskommen; wenn man zum Beispiel 33 Eier auf 4Personen aufteilen will, ohne die Eier zu zerteilen, so bleibt ein Ei übrig. Die Aufteilung ist in diesem Fall 8 Eier proPerson, und 1 Ei, das man nicht aufteilen kann. Die Operationen heißen Div (ganzzahlige Division) und Modulo undwerden in REXX durch die Symbole % und // repräsentiert:• Div

a = 33 % 4 ==> a == 8

• Mod

a = 33 // 4 ==> a == 1

In der Praxis benötigt man die Modulo-Operation sehr oft für Datumsberechnungen, z.B. 26.01.2006 war einMittwoch. Der 27.04.2006 ist genau 90 Tage später. 90 // 7 = 6 (90:7=84 Rest 6) Daraus folgt, Mittwoch + 6 Tage =Dienstag

Bit-FunktionenDie folgenden drei Funktionen vergleichen die Zeichen bitweise. Ein Bit kann dabei den Zustand 0 oder 1 haben.Jeweils 8 Bit zusammengefasst ergeben ein Zeichen. Das Zeichen "A" hat zum Beispiel den entsprechenden binärenCode 01000001 (x2b(c2x('A'))).• bitand(a,b)Beispiel: 01011010 und 01101101 ergeben 01001000

a = bitand("Z","m") ==> a == "H"

• bitor(a,b)

Page 9: WikiBooks REXX

REXX: Mathematisches und logisches 8

Beispiel: 01011010 und 01101101 ergeben 01111111

a = bitor("Z","m") ==>

• bitxor(a,b)Beispiel: 01011010 und 01101101 ergeben 00110111

a = bitor("Z","m") ==> "7"

Um diese Operationen mit dezimalen Zahlen benutzen zu können, muß man sie vorher und nachher konvertieren:

a = D2C(5)

b = D2C(9)

x = C2D(bitand(a,b)) ==> x == 1

y = C2D(bitor(a,b)) ==> y == 13

z = C2D(bitxor(a,b)) ==> z == 12

Logische OperatorenDie logischen Operatoren AND (&), OR (|) und XOR (ausschließliches oder, &&) verlangen und liefern die exaktenWerte 0 (falsch) oder 1 (wahr). Es findet keine „Kurzschlußauswertung“ statt: enthält ein logischer Ausdruckmehrere Funktionsaufrufe, so werden alle Aufrufe tatsächlich ausgeführt, auch wenn sich der Wert des Ausdrucksnicht mehr ändern kann.

REXX: String ist alles

EinleitungDer eigentliche Typ einer Variable in REXX ist ja String. Demzufolge gibt es eine Menge Anweisungen undFunktionen zur Bearbeitung von Strings.

KonkatenationEs kommt vor, das man zwei Strings (oder mehr) zu einem String zusammenführen möchte. So eine Verkettungermöglicht der Operator ||:

gesamtstring = string1||string2

Whitespace verkettet implizit unter Hinzufügung genau eines Leerzeichens:

a = 'Ottos'

b = 'Mops'

say a b /* 'Ottos Mops' */

Die Verkettung einer Variablen mit einem Stringliteral, oder von Literalen, die mit verschiedenenAnführungszeichen notiert wurden, kann auch durch direktes Aneinanderschreiben geschehen:

a = 'Otto'

say a's Mops'

say 'Otto'"s Mops"

Page 10: WikiBooks REXX

REXX: String ist alles 9

Länge eines StringsMit der Funktion length() bekommt man heraus, aus wie vielen Zeichen ein String besteht:

variable = length(string)

TeilstringsManchmal will man nur einen Teil eines Strings verwenden. Dafür kann man die Funktion substr() verwenden:

teilstring = substr(string,startposition,länge)

Beispiel: a = substr("Grottenolm",2,5) => a == "rotte"Die Funktion left(string, länge) liefert die ersten länge Zeichen, right(string, länge) entsprechend die letzten längeZeichen.

WörterzerlegungAngenommen, man will die Wörter eines als String eingegebenen Satzes analysieren. Dafür gibt es eine Anzahl vonFunktionen. Die Funktion words() gibt die Anzahl der Wörter zurück, aus denen der String zusammengesetzt ist:

variable = words(string)

Beispiel: a = words("Dieser Satz hat fünf Wörter") => a == 5Mit der Funktion word() kann man dann auf die einzelnen Wörter dieses Strings zugreifen:

variable = word(string,wert)

Beispiel: a = word("Die Katze tritt die Treppe krumm",2) => a == "Katze"

SonstigesBeispiel: a = lower("HaLlO") => a == "hallo"Beispiel: a = upper("HaLlO") => a == "HALLO"

Page 11: WikiBooks REXX

REXX: Anweisungen, Funktionen und Operatoren 10

REXX: Anweisungen, Funktionen undOperatoren

EinleitungAlle Anweisungen und Funktionen, die nicht schon in den anderen Kapiteln besprochen wurden oder nochbesprochen werden, werden hier behandelt.

Anweisungen• drop

Mit drop variable kann man einzelne Variablen löschen, oder auch einen ganzen Stem.• exit

Die Anweisung exit veranlaßt ein Programm sich zu beenden.• leave

leave bewirkt das Verlassen einer Schleife. Das ist besonders sinnvoll, wenn es sich bei der Schleife um eineEndlosschleife handelt.• nop

Die Anweisung nop steht für no operation. Es ist eine Leeranweisung, die nichts macht.• random(u,o,s)

Um Zufallszahlen zu bekommen, kann man die Funktion random() verwenden. random kennt die drei Parameter u(für Untergrenze), o (für Obergrenze) und s. Alle drei Parameter sind optional, können also auch entfallen.• C2D()C2D() wandelt Zeichen in ASCII-Code (dezimal) um.

a = C2D("A") ==> a == 65

• C2XC2X() wandelt Zeichen in ASCII-Code (hexadezimal) um

a = C2X("A") ==> a == 41

• D2CD2C() wandelt Dezimalzahlen in Zeichen um

a = D2C(33) ==> a == "!"

• D2XD2X() wandelt Dezimalzahlen in Hexadezimalzahlen um a = D2X(255) ==> a == "FF"

Page 12: WikiBooks REXX

REXX: Schleifen 11

REXX: Schleifen

Die universelle SchleifeIm Gegensatz zu anderen Programmiersprachen beginnen bei REXX alle Schleifen mit do. Die Gestaltung dieserdo-Schleife kann sehr vielfältig sein.

Ein Block von AnweisungenWenn man eine feste Folge von Anweisungen braucht (z. B. für den then- oder else-Teil einer bedingtenAnweisung), dann lassen sie sich diese zu einem do-end-Block zusammenfassen:

do

Anweisung1

Anweisung2

Anweisung3

.

.

.

AnweisungN

end

Begrenzte Anzahl von WiederholungenSoll eine Schleife eine fest vorgegebene Anzahl durchlaufen werden, dann kann man hinter dem do einen Ausdruckangeben, der die Anzahl der Wiederholungen bestimmt (Beispiel):

do 5

say "Hallo"

end

Es wird fünfmal "Hallo" ausgegeben

Zählschleifedo 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.

Page 13: WikiBooks REXX

REXX: Schleifen 12

While-SchleifeDie While-Schleife ist eine abweisende Wiederholung: Wenn der logische Ausdruck zu Beginn 0 ist, werden dieenthaltenen Anweisungen überhaupt nicht ausgeführt. (Logische Ausdrücke müssen in Rexx immer den exaktenWert 0 oder 1 ergeben, sonst tritt ein Syntaxfehler auf.)

i=0

do while Bedingung

i=i+1

say i

end

Until-SchleifeHier wird eine Abbruchbedingung verwendet; wenn diese 1 ergibt, wird die Ausführung der Schleife abgebrochen.Da die Bedingung erst am Schleifenende abgefragt wird, werden die enthaltenen Anweisungen mindestens einmalausgeführt:

i=11

do until Bedingung

i=i-1

say i

end

Endlosschleife (mit optionaler Abbruchbedingung)do forever

Anweisung...

if Abbruchbedingung then leave

end

Insbesondere für Endlosschleifen bietet sich auch der Abbruch per Ausnahmebehandlung an:

signal on halt

do forever

Anweisung...

end

halt:

say 'abgebrochen.'

iterate und leaveZur Verwendung in Schleifen gibt es die speziellen Sprunganweisungen iterate und leave. Beispiel:

do index=1

if index == 3 then

iterate index

if index > 5 then

leave

say index

end index

Page 14: WikiBooks REXX

REXX: Schleifen 13

Dabei springt iterate zum Schleifenanfang (vergleichbar dem continue anderer Programmiersprachen), währendleave die Schleife verlässt (vergleichbar break). Die Angabe der Zählvariable ist wieder optional; sie ermöglichtaußerdem die Steuerung verschachtelter Schleifen. Im Beispiel wird ausgegeben:

1

2

4

5

REXX: Bibliotheken

EinleitungWie in den meisten Programmiersprachen kann man auch in REXX eigene Funktionen schreiben. Es lassen sichauch externe Bibliotheken erstellen. Egal ob es sich um eine eigene Funktion innerhalb des Programms handelt, oderum eine externe Bilbliothek, der Aufruf ist immer:

call funktionsname parameter

eigene Funktionen innerhalb des ProgrammsAls Beispiel ein Programm zur Ausgabe der Fakultät. Die eigentliche Berechnung der Fakultät findet in derselbstgeschriebenen Funktion statt.

/* Ein Rexx-Programm */

signal on syntax

say "Bitte gib eine Zahl >= 0 ein"

pull n

do while n >= 0

say "die Fakultät zu" n "ist" fakultaet(n)

say "Bitte gib eine Zahl >= 0 ein"

pull n

end

exit 0

fakultaet: procedure

arg n

select

when n = 0 then

return 1

when n = 1 then

return 1

otherwise

return n * fakultaet(n-1)

end

syntax:

say 'Keine Zahl'

exit 1

Page 15: WikiBooks REXX

REXX: Bibliotheken 14

Externe BibliothekEine externe Bibliothek muß erst in das Programm hinzugeladen werden. Das bewirkt die Anweisung:

call load 'datei'

/* Ein REXX-Programm */

call load 'convert.r'

do forever

pull zahl

pull base

call d2n zahl,base

say zahl'='result

end

Die externe Bibliothek ist nicht ablauffähig. Um auf diesen Umstand hinzuweisen, kann man der Bibliothek zweiZeilen an den Anfang stellen:

say 'Only a Library!'

exit 1

Diese zwei Zeilen bewirken, das beim Starten der Bibliothek eine Meldung ausgegeben wird, daß es sich bei derausgeführten Datei um eine Bibliothek handelt. Das exit 1 beendet dann die Datei. Beim Aufruf mit call load auseinem REXX-Programm haben diese beiden Zeilen keine Auswirkungen.

/* REXX-Programm */

say 'Only a Library!'

exit 1

/* */

/* */

D2N: procedure

arg n,b

/* initialisierung */

z='0123456789ABCDEFGHIJKLMNOPQRSTUVW'

conv =

nstart = n

DO WHILE n > 0

p = n // b

conv = substr(z,(p+1),1)||conv

n = n % b

END

/* Ausgabe der Konversion in der Form: 23 = (10111)2 */

return conv

Page 16: WikiBooks REXX

REXX: Beispiele: Primzahlen 15

REXX: Beispiele: Primzahlen

Sieb des Erathostenes/* Ein Rexx-Programm */

/* Initialisierung */

do index = 2 to 10000

zahl.index = 1 /* Alle Zahlen sind Primzahlen */

end

/* Primzahlen sieben */

do index = 2 to 100

if zahl.index = 1 then do index2 = (index*index) to 10000 by index

zahl.index2 = 0

end

end

/* Ausgabe der Primzahlen */

do index = 2 to 10000

if zahl.index = 1 then say index

end

Primzahltest naiver Ansatz/* Ein REXX-Programm */

initial=1

obergrenze = 10000

anzahl_primzahlen = 1

primzahl_zeiger.1=2

say 2

do index = 3 to obergrenze

primzahl_wahr = 1

laeufer = initial

do anzahl_primzahlen

laeufer = primzahl_zeiger.laeufer

if index // laeufer = 0 then primzahl_wahr = 0

end

if primzahl_wahr = 1 then do

primzahl_zeiger.laeufer = index

anzahl_primzahlen = anzahl_primzahlen + 1

say index

end

end

Page 17: WikiBooks REXX

REXX: Befehlsumfang 16

REXX: Befehlsumfang

Übersicht der REXX-Anweisungen (unvollständig)

REXX-Anweisungen

address umgebung ausdruck zum Ausführen von Anweisungen außerhalb der REXX-Umgebung address CMD 'DIR*.*'

arg Argumentstring Auswertung per Kommandozeile übergebener Argumente; Abkürzung fürparse upper arg Argumentstring

arg n k

arg Argument1 [, Argument2][…] Auswertung an eine Funktion oder Prozedur übergebener Argumente;Abkürzung für parse upper arg Argument1[, Argument2][…]

arg n, k

call prozedur Aufruf einer prozedur call binkoeff n, k

call on bzw. off Bedingung schaltet die Überwachung der Bedingung ein oder aus (mit Rückkehr) call on error

call load 'bibliothek' Eine externe Bibliothek laden call load 'mathe.r'

do Alle möglichen Arten von Schleifen

drop variable variable löschen drop a

exit veranlasst das Programm sich zu beenden

if log. Ausdruck then anweisung Selektionsbefehl if a > 0 then a = a +1; else a = -a

interpret ausdruck ausdruck wird wie eine REXX-Anweisung behandelt interpret "a=5*(4+b)"

iterate Sprung zum nächsten Schleifendurchlauf, entsprechend dem continue andererSprachen

leave Verlassen einer Schleife, entsprechend dem break anderer Sprachen

nop Leeranweisung, die nichts macht

numeric digits / form / fuzz [Wert] Festlegungen für arithmetische Operationen numeric digits 20

options ausdruck nimmt spezielle Einstellungen vor

parse Analyse von Eingaben und Variablen (Vorlaufinformation)

procedure nur direkt nach einer mit call angesteuerten Marke zulässig (Funktions- oderProzeduraufruf); erzeugt einen Namespace für lokale Variablen

pull variable liest eine Zeichenkette von der aktuellen Standardqueue oder (wenn dieseleer ist) der Tastatur ein (Abkürzung für parse upper pull)

pull eingabe

push ausdruck ausdruck wird der aktuellen Standardqueue übergeben, die in diesem Fall alsStack funktioniert (LIFO)

queue ausdruck ausdruck wird der aktuellen Standardqueue übergeben (FIFO)

return ausdruck kehrt zur aufrufenden Stelle zurück und übergibt ggf. den optional angegebenWert

say ausdruck ausdruck wird auf dem Bildschirm ausgegeben say "Hallo Welt!"

select; when Bedingung then Anweisung;[…] [otherwise Anweisungen;] end

Mehrfachverzweigung

signal label Äquivalent zu goto label

signal on bzw. off Bedingung Schaltet die Überwachung der Bedingung ein bzw. aus (ohne Rückkehr) signal on break

trace Abkürzung steuert die Debugging-Ausgaben trace ?i, trace off

Page 18: WikiBooks REXX

REXX: Befehlsumfang 17

Übersicht der REXX-Funktionen (unvollständig)

REXX-Funktionen

address() gibt die Umgebung zurück z. B.: address() == 'DOS'

arg(n) gibt das n-te Argument zurück (im Falle der Kommandozeile ist n ==1)

console = arg(1)

args() gibt die Anzahl der übergebenen Argumente zurück 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() gibt je nach Option Tages- bzw. Datumsangaben zurück.

linein("dateiname") Liest eine ganze Zeile aus einer Datei ein zeile = linein("semmel.txt")

lineout("dateiname",ausdruck) ausdruck wird in Datei geschrieben lineout("semmel.txt",eumel)

lines() gibt die Anzahl der noch vollständigen Zeilen im Eingabestrom aus

queued() gibt die Anzahl ungelesenen Einträge in der aktuellen Standardqueueaus

rxqueue("Kommando"[, "Name"]) Erzeugt oder setzt eine benannte Queue bzw. fragt ihren Namen ab

Stringfunktionen

length(string) liefert die Länge eines Strings zurück x = length("abc") => x = 3

substr(string,position,zeichenzahl) Ein Teilstring aus string x = substr("abcde",2,3) => x = bcd

word(string,wert) gibt das n.te Wort des String aus a = word("polyglotte Katze",2) =>Katze

words(string) gibt die Anzahl der Wörter des Strings aus a = words("Hallo Leute") => 2

mathematische Funktionen

abs(zahl) liefert den vorzeichenlosen Teil einer Zahl zurück abs(-3) => 3

bitand() Bitweises UND

bitor() Bitweises ODER

bitxor() Bitweises XOR (exklusives Oder)

random(u,o,s) liefert eine zufällige Zahl in den Grenzen von u und o zurück. u,o und ssind 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

Page 19: WikiBooks REXX

REXX: Befehlsumfang 18

Übersicht der REXX-Operatoren (unvollständig)

VergleichsoperatorenRexx verfügt über zwei Klassen von Vergleichsoperatoren, die exakt (z. B. ==) oder numerisch (=) vergleichen. Imzweiten Fall werden zunächst etwaige Rand-Blanks entfernt, weil diese für die Interpretation als Zahl nicht vonBedeutung sind.Rexx unterstützt eine große Zahl von Varianten, wobei allerdings „nicht“ nicht, wie in manchen Sprachen üblich,durch das Ausrufungszeichen, sondern durch das mathematische Zeichen für „nicht“ (¬), ersatzweise den Backslashausgedrü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 ¬== \== "1 " \== 1 1

numerisch ungleich <>  ¬=  \= "1 " \= 1 0

exakt größer >> 30 >> "4 " 0

numerisch größer > 30 > "4 " 1

exakt größer oder gleich >== ¬<< \<< 30 >== "4 " 0

numerisch größer oder gleich >=  ¬<  \< 30 >= "4 " 1

exakt kleiner << 30 << "4 " 1

numerisch kleiner < 30 < "4 " 0

exakt kleiner oder gleich <== ¬>> \>> 30 <<= "4 " 1

numerisch kleiner oder gleich <=  ¬>  \> 30 <= "4 " 0

sonstige OperatorenDie 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, wenn a und b wahr sind

| logisches ODER a | b => wahr wenn a oder b wahr ist

&& logisches XOR a && b => wahr, wenn entweder a oder b wahr ist, aber nicht beide gleichzeitig

|| Stringverkettung (Konkatenation) "bär"||"tiger" = "bärtiger"

Page 20: WikiBooks REXX

REXX: Aufgaben 19

REXX: Aufgaben• Rao-Zahlen

Es gibt Zahlen für die gilt, daß ist. Mit ist gemeint, daß und hintereinander alseine Zahl aufgeschrieben wird. So wird aus und die Zahl . Diesen Vorgang nenntman Konkatenation. Ein Beispiel für eine Rao-Zahl ist 1233, da ergibt.Schreibe in REXX ein Programm, das die Rao-Zahlen bis 1.000.000 ausgibt.

REXX: Quellen

REXX-Versionen• BREXX - Vasilis Vlachoudis (DOS, Linux, Amiga, ...)• Regina (Linux, Windows, ...)• ARexx - William S. Hawes (Amiga)

Literatur• Michael Cowlishaw, The Rexx Language: A Practical Approach to Programming, ISBN 0137806515• Michael Metz et al., ARexx. Eine Einführung und mehr, ISBN 3930733005• Karlheinz Wittemann, REXX unter MVS-TSO/E, ISBN 3446179569• Howard Fosdick, Rexx Programmer's Reference (Wiley/Wrox: 2005), ISBN 0764579967

Weblinks• The REXX Language Association [1]

• Regina [2]

• BREXX [3]

Referenzen[1] http:/ / www. rexxla. org/[2] http:/ / regina-rexx. sourceforge. net/[3] ftp:/ / ftp. gwdg. de/ pub/ languages/ rexx/ brexx/

Page 21: WikiBooks REXX

Quelle(n) und Bearbeiter des/der Artikel(s) 20

Quelle(n) und Bearbeiter des/der Artikel(s)REXX  Quelle: http://de.wikibooks.org/w/index.php?oldid=318950  Bearbeiter: Arbol01, E^(nix), Klaus Eifert, Moolsan, Stefan Majewsky, 1 anonyme Bearbeitungen

REXX: Einleitung  Quelle: http://de.wikibooks.org/w/index.php?oldid=399535  Bearbeiter: TobiasHerp, 1 anonyme Bearbeitungen

REXX: Variablen  Quelle: http://de.wikibooks.org/w/index.php?oldid=398320  Bearbeiter: Arbol01, Haden2, TobiasHerp

REXX: Aus- und Eingabe  Quelle: http://de.wikibooks.org/w/index.php?oldid=398330  Bearbeiter: Arbol01, TobiasHerp, 1 anonyme Bearbeitungen

REXX: Mathematisches und logisches  Quelle: http://de.wikibooks.org/w/index.php?oldid=458040  Bearbeiter: AlB, Arbol01, Mjchael, TobiasHerp, 4 anonyme Bearbeitungen

REXX: String ist alles  Quelle: http://de.wikibooks.org/w/index.php?oldid=398332  Bearbeiter: Arbol01, TobiasHerp

REXX: Anweisungen, Funktionen und Operatoren  Quelle: http://de.wikibooks.org/w/index.php?oldid=459380  Bearbeiter: AlB, Arbol01, TobiasHerp, 1 anonyme Bearbeitungen

REXX: Schleifen  Quelle: http://de.wikibooks.org/w/index.php?oldid=398328  Bearbeiter: Arbol01, TobiasHerp

REXX: Bibliotheken  Quelle: http://de.wikibooks.org/w/index.php?oldid=398335  Bearbeiter: Arbol01, TobiasHerp

REXX: Beispiele: Primzahlen  Quelle: http://de.wikibooks.org/w/index.php?oldid=419120  Bearbeiter: Arbol01, Polluks

REXX: Befehlsumfang  Quelle: http://de.wikibooks.org/w/index.php?oldid=398336  Bearbeiter: Arbol01, TobiasHerp

REXX: Aufgaben  Quelle: http://de.wikibooks.org/w/index.php?oldid=398337  Bearbeiter: Arbol01, TobiasHerp

REXX: Quellen  Quelle: http://de.wikibooks.org/w/index.php?oldid=317069  Bearbeiter: AlB, Arbol01, Polluks

Page 22: WikiBooks REXX

Quelle(n), Lizenz(en) und Autor(en) des Bildes 21

LizenzCreative Commons Attribution-Share Alike 3.0 Unportedhttp:/ / creativecommons. org/ licenses/ by-sa/ 3. 0/