Rexx- Rexx
Paradigma | Multiparadigma : prozedural , strukturiert |
---|---|
Entworfen von | Mike Cowlishaw |
Entwickler | Mike Cowlishaw, IBM |
Erstmals erschienen | 1979 |
Stabile Version |
ANSI X3.274/1996
|
Schreibdisziplin | Dynamisch |
Dateinamenerweiterungen | .cmd, .bat, .exec, .rexx, .rex, EXEC |
Wichtige Implementierungen | |
VM/SP R3, TSO/E V2, SAAREXX, ARexx , BREXX, Regina, Personal REXX, REXX/imc | |
Dialekte | |
NetRexx , Objekt REXX , jetzt ooREXX , KEXX | |
Beeinflusst von | |
PL/I , ALGOL , EXEC , EXEC 2 | |
Beeinflusst | |
NetRexx , Objekt REXX | |
|
Rexx ( Restructured Extended Executor ) ist eine interpretierte Programmiersprache , die bei IBM von Mike Cowlishaw entwickelt wurde . Es ist eine strukturierte High-Level-Programmiersprache, die für einfaches Lernen und Lesen entwickelt wurde. Proprietäre und Open-Source- Rexx- Interpreter gibt es für eine Vielzahl von Computerplattformen; Compiler existieren für IBM Großrechner .
Rexx wird als Skript- und Makrosprache verwendet und wird häufig zum Verarbeiten von Daten und Texten und zum Erstellen von Berichten verwendet; Diese Ähnlichkeiten mit Perl bedeuten, dass Rexx in der Common Gateway Interface (CGI)-Programmierung gut funktioniert und tatsächlich für diesen Zweck verwendet wird. Rexx ist die primäre Skriptsprache in einigen Betriebssystemen, zB OS/2 , MVS , VM , AmigaOS und wird auch als interne Makrosprache in anderer Software wie SPFPC , KEDIT , THE und dem Terminalemulator ZOC verwendet . Darüber hinaus kann die Rexx-Sprache für Skripte und Makros in jedem Programm verwendet werden, das die Sprachen der Windows Scripting Host ActiveX-Skripting-Engines verwendet (zB VBScript und JScript), wenn eine der Rexx-Engines installiert ist.
Rexx wird mit VM/SP Release 3 aufwärts, TSO/E Version 2 aufwärts, OS/2 (1.3 und höher, wo es offiziell als Procedures Language/2 bezeichnet wird ), AmigaOS Version 2 aufwärts, PC DOS ( 7.0 oder höher) geliefert 2000 ), ArcaOS und Windows NT 4.0 (Ressourcenkit: Regina). REXX-Skripte für OS/2 teilen die Dateinamenerweiterung .cmd mit anderen Skriptsprachen, und die erste Zeile des Skripts gibt den zu verwendenden Interpreter an. REXX-Makros für REXX-fähige Anwendungen verwenden Erweiterungen, die von der Anwendung bestimmt werden. In den späten 1980er Jahren wurde Rexx die allgemeine Skriptsprache für IBM Systems Application Architecture , wo es in "SAA Procedure Language REXX" umbenannt wurde.
Ein Rexx-Skript oder -Befehl wird manchmal als EXEC in Anlehnung an den CMS-Dateityp bezeichnet, der für EXEC- , EXEC 2- und REXX-Skripte auf CP/CMS und VM/370 bis z/VM verwendet wird .
Merkmale
Rexx hat die folgenden Eigenschaften und Funktionen:
- Einfache Syntax
- Die Möglichkeit, Befehle an mehrere Umgebungen weiterzuleiten
- Die Fähigkeit, Funktionen, Prozeduren und Befehle zu unterstützen, die einer bestimmten aufrufenden Umgebung zugeordnet sind.
- Ein integrierter Stack mit der Möglichkeit, mit dem Host-Stack zu interagieren, falls vorhanden.
- Kleiner Befehlssatz mit nur zwei Dutzend Anleitungen
- Freiform- Syntax
- Bei Tokens, die keine Groß-/Kleinschreibung beachten, einschließlich Variablennamen
- Zeichenfolge Basis
- Dynamische Datentypisierung , keine Deklarationen
- Keine reservierten Schlüsselwörter , außer im lokalen Kontext
- Keine Include-Datei-Einrichtungen
- Beliebige numerische Genauigkeit
- Dezimalarithmetik, Gleitkomma
- Eine reiche Auswahl an integrierten Funktionen, insbesondere Zeichenfolgen- und Textverarbeitung
- Automatische Speicherverwaltung
- Crash-Schutz
- Inhaltsadressierbare Datenstrukturen
- Assoziative Arrays
- Einfacher Zugriff auf Systembefehle und -einrichtungen
- Einfache Fehlerbehandlung und integriertes Tracing und Debugger
- Einige künstliche Einschränkungen
- Vereinfachte I/O-Einrichtungen
- Unkonventionelle Operatoren
- Unterstützt nur teilweise Befehlszeilenparameter im Unix-Stil, außer bei bestimmten Implementierungen
- Bietet keine grundlegende Terminalsteuerung als Teil der Sprache, mit Ausnahme bestimmter Implementierungen
- Bietet keine generische Möglichkeit zum Einbinden von Funktionen und Unterprogrammen aus externen Bibliotheken, mit Ausnahme bestimmter Implementierungen
Rexx hat nur 23, weitgehend selbstverständliche Anweisungen (wie call
, parse
, und select
) mit minimalen Zeichensetzungs- und Formatierungsanforderungen. Es handelt sich im Wesentlichen um eine fast frei gestaltete Sprache mit nur einem Datentyp, der Zeichenfolge; Diese Philosophie bedeutet, dass alle Daten sichtbar (symbolisch) sind und das Debugging und Tracing vereinfacht werden.
Die Syntax von Rexx ähnelt PL/I , hat aber weniger Notationen; dies macht es schwieriger (nach Programm), aber einfacher zu verwenden, außer in Fällen, in denen PL/I-Gewohnheiten zu Überraschungen führen können. Eines der Designziele von REXX war das Prinzip des geringsten Erstaunens .
Geschichte
vor 1990
Rexx wurde zwischen dem 20. März 1979 und Mitte 1982 von Mike Cowlishaw von IBM in Assembler als 'Eigenzeit'-Projekt entworfen und erstmals implementiert, ursprünglich als Skript-Programmiersprache , um die Sprachen EXEC und EXEC 2 zu ersetzen . Es wurde als Makro- oder Skriptsprache für jedes System entwickelt. Als solches gilt Rexx als Vorläufer von Tcl und Python . Rexx war von seinem Schöpfer auch als eine vereinfachte und leichter zu erlernende Version der PL/I- Programmiersprache gedacht . Einige Unterschiede zu PL/I können den Unachtsamen jedoch zum Stolpern bringen.
Es wurde erstmals auf der SHARE 56-Konferenz in Houston, Texas im Jahr 1981 öffentlich beschrieben, wo die Reaktion der Kunden, die von Ted Johnston von SLAC verfochten wurde , dazu führte, dass es 1982 als IBM-Produkt ausgeliefert wurde.
Im Laufe der Jahre hat IBM Rexx in fast alle seine Betriebssysteme ( VM/CMS , MVS TSO/E , IBM i , VSE/ESA , AIX , PC DOS und OS/2 ) integriert und Versionen für Novell NetWare bereitgestellt . Windows , Java und Linux .
Die erste Nicht-IBM-Version wurde 1984/5 von Charles Daney für PC-DOS geschrieben und von der Mansfield Software Group (gegründet von Kevin J. Kearney 1986) vermarktet. Die erste Compiler-Version erschien 1987, geschrieben für CMS von Lundin und Woodruff. Andere Versionen wurden auch für Atari , AmigaOS , Unix (viele Varianten), Solaris , DEC , Windows , Windows CE , Pocket PC , DOS , Palm OS , QNX , OS/2 , Linux , BeOS , EPOC32 / Symbian , AtheOS entwickelt. OpenVMS , Apple - Macintosh und Mac OS X .
Die Amiga- Version von Rexx, genannt ARexx , war ab AmigaOS 2 enthalten und war sowohl für die Skripterstellung als auch für die Anwendungssteuerung beliebt. Viele Amiga-Anwendungen haben einen eingebauten "ARexx-Port", der die Steuerung der Anwendung von Rexx ermöglicht. Ein einziges Rexx-Skript könnte sogar zwischen verschiedenen Rexx-Ports wechseln, um mehrere laufende Anwendungen zu steuern.
1990 bis heute
1990 organisierte Cathie Dager von SLAC das erste unabhängige Rexx-Symposium, das zur Gründung der REXX Language Association führte. Symposien finden jährlich statt.
Es stehen mehrere Freeware- Versionen von Rexx zur Verfügung. 1992 erschienen die beiden am weitesten verbreiteten Open-Source- Portierungen: REXX/imc von Ian Collier für Unix und Regina von Anders Christensen (später von Mark Hessling übernommen) für Windows und Unix. BREXX ist für WinCE- und Pocket PC-Plattformen bekannt und wurde auf VM/370 und MVS " zurückportiert " .
OS/2 hat ein visuelles Entwicklungssystem von Watcom VX-REXX . Ein weiterer Dialekt war VisPro REXX von Hockware.
Portable Rexx von Kilowatt und Personal Rexx von Quercus sind zwei Rexx-Interpreter, die für DOS entwickelt wurden und auch unter Windows über eine Eingabeaufforderung ausgeführt werden können. Seit Mitte der 1990er Jahre sind zwei neuere Varianten von Rexx erschienen:
- NetRexx : Kompiliert in Java- Bytecode über Java-Quellcode; dieser hat überhaupt keine reservierten Schlüsselwörter, verwendet das Java-Objektmodell und ist daher generell nicht aufwärtskompatibel zum 'klassischen' Rexx.
- Object REXX : eine objektorientierte, allgemein aufwärtskompatible Version von Rexx.
1996 veröffentlichte das American National Standards Institute (ANSI) einen Standard für Rexx: ANSI X3.274–1996 „Information Technology – Programming Language REXX“. Seit 1985 wurden mehr als zwei Dutzend Bücher über Rexx veröffentlicht.
Rexx feierte am 20. März 2004 sein 25-jähriges Bestehen, das im Mai 2004 auf dem 15. Internationalen REXX-Symposium der REXX Language Association in Böblingen gefeiert wurde.
Am 12. Oktober 2004 gab IBM ihren Plan bekannt, die Sourcen ihrer Object REXX- Implementierung unter der Common Public License zu veröffentlichen . Neuere Versionen von Object REXX enthalten eine ActiveX Windows Scripting Host (WSH)-Scripting-Engine, die diese Version der Rexx-Sprache implementiert.
Am 22. Februar 2005 wurde die erste öffentliche Veröffentlichung von Open Object Rexx (ooRexx) angekündigt. Dieses Produkt enthält eine WSH-Skript-Engine, die die Programmierung des Windows-Betriebssystems und der Anwendungen mit Rexx auf die gleiche Weise ermöglicht, in der Visual Basic und JScript von der standardmäßigen WSH-Installation und Perl , Tcl , Python -Skript-Engines von Drittanbietern implementiert werden .
Im Januar 2017 wurde REXX im TIOBE-Index als eine der fünfzig Sprachen in seinen Top 100 aufgeführt, die nicht zu den Top 50 gehören.
2019 feierte das 30. Symposium der Rexx Language Association das 40-jährige Bestehen von Rexx. Das Symposium fand in Hursley, England, statt, wo Rexx erstmals konzipiert und implementiert wurde.
Werkzeugsätze
Rexx/Tk, ein Toolkit für Grafiken, das in Rexx-Programmen in gleicher Weise wie Tcl/Tk verwendet werden kann, ist weit verbreitet.
Für Windows wurde eine Rexx-IDE, RxxxEd, entwickelt. RxSock für die Netzwerkkommunikation sowie andere Add-Ons und Implementierungen von Regina Rexx wurden entwickelt, und ein Rexx-Interpreter für die Windows-Befehlszeile wird in den meisten Resource Kits für verschiedene Windows-Versionen mitgeliefert und funktioniert unter allen sowie DOS.
Rechtschreibung und Groß-/Kleinschreibung
Ursprünglich hieß die Sprache Rex ( Reformed Executor ); das zusätzliche "X" wurde hinzugefügt, um Kollisionen mit anderen Produktnamen zu vermeiden. REX war ursprünglich nur in Großbuchstaben geschrieben, weil der Mainframe-Code auf Großbuchstaben ausgerichtet war. Der Stil zu dieser Zeit bestand darin, Namen in Großbuchstaben zu verwenden, zum Teil, weil fast der gesamte Code damals noch in Großbuchstaben geschrieben war. Für das Produkt wurde es REXX, und beide Ausgaben von Mike Cowlishaws Buch verwenden Großbuchstaben. Die Erweiterung zum REstructured eXtended eXecutor wurde 1984 für das Systemprodukt genutzt.
Syntax
Looping
Die Schleifensteuerungsstruktur in Rexx beginnt mit einem DO
und endet mit einem, gibt es END
aber in verschiedenen Varianten. NetRexx verwendet das Schlüsselwort LOOP
anstelle von DO
for looping, während ooRexx beim Loopen LOOP
und DO
als gleichwertig behandelt .
Bedingte Schleifen
Rexx unterstützt eine Vielzahl traditioneller strukturierter Programmierschleifen beim Testen einer Bedingung entweder vor ( do while
) oder nach ( do until
) der Ausführung der Befehlsliste:
do while [condition]
[instructions]
end
do until [condition]
[instructions]
end
Wiederholte Schleifen
Wie die meisten Sprachen kann Rexx beim Inkrementieren einer Indexvariable eine Schleife ausführen und anhalten, wenn ein Limit erreicht wird:
do index = start [to limit] [by increment] [for count]
[instructions]
end
Das Inkrement kann weggelassen werden und hat den Standardwert 1. Das Limit kann auch weggelassen werden, wodurch die Schleife für immer fortgesetzt wird.
Rexx erlaubt gezählte Schleifen, bei denen am Anfang der Schleife ein Ausdruck berechnet wird und die Anweisungen innerhalb der Schleife so oft ausgeführt werden:
do expression
[instructions]
end
Rexx kann sogar loopen, bis das Programm beendet ist:
do forever
[instructions]
end
Ein Programm kann mit der leave
Anweisung aus der aktuellen Schleife ausbrechen , was der normale Weg ist, eine do forever
Schleife zu verlassen, oder sie mit der iterate
Anweisung kurzschließen .
Kombinierte Schleifen
Am ungewöhnlichsten ermöglicht Rexx, dass sowohl bedingte als auch sich wiederholende Elemente in derselben Schleife kombiniert werden:
do index = start [to limit] [by increment] [for count] [while condition]
[instructions]
end
do expression [until condition]
[instructions]
end
Bedingungen
Prüfbedingungen mit IF
:
if [condition] then
do
[instructions]
end
else
do
[instructions]
end
Die ELSE
Klausel ist optional.
Für einzelne Anweisungen DO
und END
kann auch weggelassen werden:
if [condition] then
[instruction]
else
[instruction]
Die Einrückung ist optional, trägt jedoch zur Verbesserung der Lesbarkeit bei.
Testen auf mehrere Bedingungen
SELECT
ist die CASE-Struktur von Rexx , wie viele andere von PL/I abgeleitete Konstrukte . Wie einige Implementierungen von CASE-Konstrukten in anderen dynamischen Sprachen WHEN
spezifizieren die Klauseln von Rexx vollständige Bedingungen, die nicht miteinander in Beziehung stehen müssen. Insofern ähneln sie eher kaskadierten Codesätzen IF-THEN-ELSEIF-THEN-...-ELSE
als der C- oder Java- switch
Anweisung.
select
when [condition] then
[instruction] or NOP
when [condition] then
do
[instructions] or NOP
end
otherwise
[instructions] or NOP
end
Der NOP
Befehl führt "keine Operation" aus und wird verwendet, wenn der Programmierer an einer Stelle, an der ein oder mehrere Befehle erforderlich wären, nichts tun möchte.
Die OTHERWISE-Klausel ist optional. Wenn es weggelassen wird und keine WHEN-Bedingungen erfüllt sind, wird die SYNTAX-Bedingung ausgelöst.
Einfache Variablen
Variablen in Rexx sind typlos und werden zunächst als ihre Namen in Großbuchstaben ausgewertet. Daher kann der Typ einer Variablen mit ihrer Verwendung im Programm variieren:
say hello /* => HELLO */
hello = 25
say hello /* => 25 */
hello = "say 5 + 3"
say hello /* => say 5 + 3 */
interpret hello /* => 8 */
drop hello
say hello /* => HELLO */
Zusammengesetzte Variablen
Im Gegensatz zu vielen anderen Programmiersprachen bietet das klassische Rexx keine direkte Unterstützung für Arrays von Variablen, die durch einen numerischen Index adressiert werden. Stattdessen stellt es zusammengesetzte Variablen bereit . Eine zusammengesetzte Variable besteht aus einem Stamm gefolgt von einem Schwanz. A . (Punkt) wird verwendet, um den Stamm mit dem Schwanz zu verbinden. Wenn die verwendeten Enden numerisch sind, ist es einfach, denselben Effekt wie bei einem Array zu erzielen.
do i = 1 to 10
stem.i = 10 - i
end
Danach existieren folgende Variablen mit folgenden Werten: stem.1 = 9, stem.2 = 8, stem.3 = 7
...
Im Gegensatz zu Arrays muss der Index für eine Stammvariable keinen ganzzahligen Wert haben. Der folgende Code ist beispielsweise gültig:
i = 'Monday'
stem.i = 2
In Rexx ist es auch möglich, einen Standardwert für einen Vorbau zu setzen.
stem. = 'Unknown'
stem.1 = 'USA'
stem.44 = 'UK'
stem.33 = 'France'
Nach diesen Zuordnungen würde sich der Begriff stem.3
ergeben 'Unknown'
.
Der gesamte Stamm kann auch mit der DROP-Anweisung gelöscht werden.
drop stem.
Dies hat auch den Effekt, dass alle zuvor festgelegten Standardwerte entfernt werden.
Konventionell (und nicht als Teil der Sprache) wird die Verbindung stem.0
oft verwendet, um zu verfolgen, wie viele Elemente sich in einem Stamm befinden, zum Beispiel könnte ein Verfahren zum Hinzufügen eines Wortes zu einer Liste wie folgt kodiert werden:
add_word: procedure expose dictionary.
parse arg w
n = dictionary.0 + 1
dictionary.n = w
dictionary.0 = n
return
Es ist auch möglich, mehrere Elemente im Ende einer zusammengesetzten Variablen zu haben. Zum Beispiel:
m = 'July'
d = 15
y = 2005
day.y.m.d = 'Friday'
Mehrere numerische Schwanzelemente können verwendet werden, um den Effekt eines mehrdimensionalen Arrays bereitzustellen.
Funktionen, die den zusammengesetzten Rexx-Variablen ähneln, finden sich in vielen anderen Sprachen (einschließlich assoziativer Arrays in AWK , Hashes in Perl und Hashtables in Java ). Die meisten dieser Sprachen bieten eine Anweisung, über alle Schlüssel (oder Schwänze in Rexx-Begriffen) eines solchen Konstrukts zu iterieren , aber dies fehlt im klassischen Rexx. Stattdessen ist es erforderlich, entsprechende Hilfslisten mit Endwerten zu führen. Beispielsweise könnte in einem Programm zum Zählen von Wörtern die folgende Prozedur verwendet werden, um jedes Vorkommen eines Wortes aufzuzeichnen.
add_word: procedure expose count. word_list
parse arg w .
count.w = count.w + 1 /* assume count. has been set to 0 */
if count.w = 1 then word_list = word_list w
return
und dann später:
do i = 1 to words(word_list)
w = word(word_list,i)
say w count.w
end
Auf Kosten einiger Klarheit ist es möglich, diese Techniken in einem einzigen Stamm zu kombinieren:
add_word: procedure expose dictionary.
parse arg w .
dictionary.w = dictionary.w + 1
if dictionary.w = 1 /* assume dictionary. = 0 */
then do
n = dictionary.0+1
dictionary.n = w
dictionary.0 = n
end
return
und später:
do i = 1 to dictionary.0
w = dictionary.i
say i w dictionary.w
end
Rexx bietet hier kein Sicherheitsnetz, wenn also eines der Wörter eine ganze Zahl weniger ist, wird dictionary.0
diese Technik auf mysteriöse Weise versagen.
Neuere Implementierungen von Rexx, einschließlich IBMs Object REXX und die Open-Source-Implementierungen wie ooRexx enthalten ein neues Sprachkonstrukt , um die Iteration über den Wert eines Stamms oder über ein anderes Sammlungsobjekt wie ein Array, eine Tabelle oder eine Liste zu vereinfachen.
do i over stem.
say i '-->' stem.i
end
Keyword-Anweisungen
PARSE
Die PARSE
Anweisung ist besonders mächtig; es kombiniert einige nützliche String-Handling-Funktionen. Seine Syntax lautet:
parse [upper] origin [template]
wobei origin die Quelle angibt:
-
arg
(Argumente, am Ende der Befehlszeile auf oberster Ebene) -
linein
(Standardeingabe, zB Tastatur) -
pull
(Rexx-Datenwarteschlange oder Standardeingabe) -
source
(Infos zur Programmausführung) -
value
(ein Ausdruck)with
: das Schlüsselwortwith
ist erforderlich, um anzugeben, wo der Ausdruck endet -
var
(eine Variable) -
version
(Versions-/Versionsnummer)
und Vorlage können sein:
- Liste der Variablen
- Trennzeichen für Spaltennummern
- wörtliche Trennzeichen
upper
es ist optional; falls angegeben, werden die Daten vor dem Parsen in Großbuchstaben umgewandelt.
Beispiele:
Verwenden einer Liste von Variablen als Vorlage
myVar = "John Smith"
parse var myVar firstName lastName
say "First name is:" firstName
say "Last name is:" lastName
zeigt folgendes an:
First name is: John Last name is: Smith
Verwenden eines Trennzeichens als Vorlage:
myVar = "Smith, John"
parse var myVar LastName "," FirstName
say "First name is:" firstName
say "Last name is:" lastName
zeigt auch Folgendes an:
First name is: John Last name is: Smith
Verwenden von Spaltennummerntrennzeichen:
myVar = "(202) 123-1234"
parse var MyVar 2 AreaCode 5 7 SubNumber
say "Area code is:" AreaCode
say "Subscriber number is:" SubNumber
zeigt folgendes an:
Area code is: 202 Subscriber number is: 123-1234
Eine Vorlage kann eine Kombination aus Variablen, Literaltrennzeichen und Spaltennummerntrennzeichen verwenden.
INTERPRETIEREN
Die INTERPRET-Anweisung wertet ihr Argument aus und behandelt ihren Wert als Rexx-Anweisung. Manchmal ist INTERPRET der klarste Weg, um eine Aufgabe auszuführen, aber es wird oft verwendet, wo ein klarerer Code möglich ist, z value()
. B. mit .
Andere Verwendungen von INTERPRET sind Rexxs (dezimale) Arithmetik mit willkürlicher Genauigkeit (einschließlich Fuzzy-Vergleiche), die Verwendung der PARSE-Anweisung mit programmgesteuerten Templates, Stemmed-Arrays und Sparse-Arrays.
/* demonstrate INTERPRET with square(4) => 16 */
X = 'square'
interpret 'say' X || '(4) ; exit'
SQUARE: return arg(1)**2
Dies zeigt 16 an und wird beendet. Da Variableninhalte in Rexx Strings sind, einschließlich rationaler Zahlen mit Exponenten und sogar ganzen Programmen, bietet Rexx an, Strings als ausgewertete Ausdrücke zu interpretieren.
Diese Funktion könnte verwendet werden, um Funktionen als Funktionsparameter zu übergeben , wie z. B. die Übergabe von SIN oder COS an eine Prozedur zur Berechnung von Integralen.
Rexx bietet nur grundlegende mathematische Funktionen wie ABS, DIGITS, MAX, MIN, SIGN, RANDOM und einen vollständigen Satz von Hex- plus Binärumwandlungen mit Bitoperationen. Komplexere Funktionen wie SIN wurden von Grund auf neu implementiert oder aus externen Bibliotheken von Drittanbietern bezogen . Einige externe Bibliotheken, normalerweise solche, die in traditionellen Sprachen implementiert sind, unterstützten keine erweiterte Genauigkeit.
Spätere Versionen (nicht-klassisch) unterstützen CALL variable
Konstrukte. Zusammen mit der eingebauten Funktion VALUE
kann CALL anstelle vieler Fälle von verwendet werden INTERPRET
. Dies ist ein klassisches Programm:
/* terminated by input "exit" or similar */
do forever ; interpret linein() ; end
Ein etwas ausgefeilterer "Rexx-Rechner":
X = 'input BYE to quit'
do until X = 'BYE' ; interpret 'say' X ; pull X ; end
PULL
ist eine Abkürzung für parse upper pull
. Ebenso ARG
ist die Abkürzung für parse upper arg
.
Die Macht des INTERPRET-Befehls hatte andere Verwendungszwecke. Das Valor-Softwarepaket verließ sich auf die interpretative Fähigkeit von Rexx, eine OOP- Umgebung zu implementieren . Eine weitere Verwendung wurde in einem unveröffentlichten Westinghouse- Produkt namens Time Machine gefunden , das nach einem schwerwiegenden Fehler vollständig wiederhergestellt werden konnte.
NUMERISCH
say digits() fuzz() form() /* => 9 0 SCIENTIFIC */
say 999999999+1 /* => 1.000000000E+9 */
numeric digits 10 /* only limited by available memory */
say 999999999+1 /* => 1000000000 */
say 0.9999999999=1 /* => 0 (false) */
numeric fuzz 3
say 0.99999999=1 /* => 1 (true) */
say 0.99999999==1 /* => 0 (false) */
say 100*123456789 /* => 1.23456789E+10 */
numeric form engineering
say 100*123456789 /* => 12.34567890E+9 */
say 53 // 7 /* => 4 (rest of division)*/
Berechnet √ 2 | Berechnet e | |
---|---|---|
Code |
numeric digits 50
n=2
r=1
do forever /* Newton's method */
rr=(n/r+r)/2
if r=rr then leave
r=rr
end
say "sqrt" n ' = ' r
|
numeric digits 50
e=2.5
f=0.5
do n=3
f=f/n
ee=e+f
if e=ee then leave
e=ee
end
say "e =" e
|
Ausgang | Quadrat 2 = 1,414213562373095048801688724209698078569671875377 | e = 2,7182818284590452353602874713526624977572470936998 |
SIGNAL
Der SIGNAL-Befehl ist für anormale Änderungen im Steuerungsfluss gedacht (siehe nächster Abschnitt). Sie kann jedoch missbraucht und wie die GOTO- Anweisung in anderen Sprachen behandelt werden (obwohl sie nicht genau äquivalent ist, da sie Schleifen und andere Konstrukte beendet). Dies kann zu schwer lesbarem Code führen.
Fehlerbehandlung und Ausnahmen
Es ist in Rexx möglich, Fehler und andere Ausnahmen mit der SIGNAL-Anweisung abzufangen und zu behandeln. Es gibt sieben Systemzustände: ERROR, FAILURE, HALT, NOVALUE, NOTREADY, LOSTDIGITS und SYNTAX. Die Handhabung von jedem kann im Quellcode nach Belieben ein- und ausgeschaltet werden.
Das folgende Programm läuft, bis es vom Benutzer beendet wird:
signal on halt;
do a = 1
say a
do 100000 /* a delay */
end
end
halt:
say "The program was stopped by the user"
exit
Eine Anweisung fängt Verwendungen von undefinierten Variablen ab, die andernfalls ihren eigenen Namen (in Großbuchstaben) als ihren Wert erhalten würden. Unabhängig vom Zustand der Bedingung kann der Status einer Variablen immer mit der eingebauten Funktion überprüft werden, die VAR für definierte Variablen zurückgibt.
signal on novalue
NOVALUE
SYMBOL
Die VALUE
Funktion kann verwendet werden, um den Wert von Variablen zu erhalten, ohne eine NOVALUE
Bedingung auszulösen , aber ihr Hauptzweck besteht darin, Umgebungsvariablen zu lesen und zu setzen , ähnlich wie bei POSIX getenv
und putenv
.
Bedingungen
ERROR
- Positiver RC von einem Systembefehl
FAILURE
- Negativer RC für einen Systembefehl (zB Befehl existiert nicht)
HALT
- Abnormale Beendigung
NOVALUE
- Es wurde auf eine nicht gesetzte Variable verwiesen
NOTREADY
- Eingabe- oder Ausgabefehler (zB Leseversuche über das Dateiende hinaus)
SYNTAX
- Ungültige Programmsyntax oder eine andere Fehlerbedingung
LOSTDIGITS
- Signifikante Ziffern gehen verloren (ANSI Rexx, nicht in TRL 2. Auflage)
Wenn eine Bedingung von verarbeitet wird SIGNAL ON
, können die Systemvariablen SIGL
und RC
analysiert werden, um die Situation zu verstehen. RC enthält den Rexx-Fehlercode und SIGL enthält die Zeilennummer, in der der Fehler aufgetreten ist.
Ab Rexx Version 4 können Bedingungen Namen erhalten, und es gibt auch ein CALL ON
Konstrukt. Das ist praktisch, wenn externe Funktionen nicht unbedingt vorhanden sind:
ChangeCodePage: procedure /* protect SIGNAL settings */
signal on syntax name ChangeCodePage.Trap
return SysQueryProcessCodePage()
ChangeCodePage.Trap: return 1004 /* windows-1252 on OS/2 */
Siehe auch
Verweise
Weiterlesen
- Callaway, Merrill. Das ARexx-Kochbuch: Ein Tutorial-Leitfaden zur ARexx-Sprache auf dem Commodore-Amiga-Personalcomputer . Whitestone, 1992. ISBN 978-0963277305 .
- Callaway, Merrill. Das Rexx-Kochbuch: Eine Anleitung zur Rexx-Sprache in OS/2 & Warp auf dem IBM Personal Computer . Whitestone, 1995. ISBN 0-9632773-4-0 .
- Cowlishaw, Michael. Die Rexx-Sprache: Eine praktische Herangehensweise an die Programmierung . Prentice Hall, 1990. ISBN 0-13-780651-5 .
- Cowlishaw, Michael. Die NetRexx-Sprache . Prentice Hall, 1997. ISBN 0-13-806332-X .
- Daney, Charles. Programmierung in REXX . McGraw-Hill, TX, 1990. ISBN 0-07-015305-1 .
- Ender, Tom. Objektorientierte Programmierung mit Rexx . John Wiley & Sons, 1997. ISBN 0-471-11844-3 .
- Fosdick, Howard. Referenz für Rexx-Programmierer . Wiley/Wrox, 2005. ISBN 0-7645-7996-7 .
- Gargiulo, Gabriel. REXX mit OS/2-, TSO- und CMS-Funktionen . MVS Training, 1999 (dritte Auflage 2004). ISBN 1-892559-03-X .
- Goldberg, Gabriel und Smith, Philip H. Das Rexx-Handbuch . McGraw-Hill, TX, 1992. ISBN 0-07-023682-8 .
- Goran, Richard K. REXX Reference Summary Handbook . CFS Nevada, Inc., 1997. ISBN 0-9639854-3-4 .
- IBM Redbooks. Implementieren der Rexx-Unterstützung in Sdsf . Vervante, 2007. ISBN 0-7384-8914-X .
- Kiesel, Peter C. Rexx: Fortgeschrittene Techniken für Programmierer . McGraw-Hill, TX, 1992. ISBN 0-07-034600-3 .
- Marco, Lou ISPF/REXX-Entwicklung für erfahrene Programmierer . CBM-Bücher, 1995. ISBN 1-878956-50-7
- O'Hara, Robert P. und Gomberg, David Roos. Moderne Programmierung mit Rexx . Prentice Hall, 1988. ISBN 0-13-597329-5 .
- Rudd, Anthony S. 'Praktische Verwendung von TSO REXX'. CreateSpace, 2012. ISBN 978-1475097559 .
- Schindler, Wilhelm. Down to Earth Rexx . Perfekte Nischensoftware, 2000. ISBN 0-9677590-0-5 .