Object REXX
Open Object Rexx (ooRexx) | |
---|---|
Basisdaten | |
Paradigmen: | multiparadigmatisch (objektorientiert, prozedural, imperativ, strukturiert) |
Erscheinungsjahr: | 1988 |
Designer: | Simon C. Nash (IBM) |
Entwickler: | IBM |
Aktuelle Version: | 5.0.0 (22.12.2022) |
Aktuelle Vorabversion: | 5.1.0 (19.09.2024) |
Typisierung: | dynamisch |
Wichtige Implementierungen: | Object REXX (until 2004), ooRexx (since 2005) |
Standardisierungen: | ANSI |
Beeinflusst von: | Rexx, Smalltalk |
Beeinflusste: | NetRexx |
Betriebssystem: | Plattformunabhängigkeit: Linux, Microsoft Windows, macOS, Solaris, OpenIndiana, AIX, FreeBSD, OS/2 |
Lizenz: | CPL 1.0, GPLv2 |
www.rexxla.org |
Object REXX ist eine universell nutzbare, interpretierte, objektorientierte höhere Programmiersprache. Heute wird sie oft als ooRexx (kurz für „Open Object Rexx“) bezeichnet, welches der direkte Open Source Nachfolger von Object REXX ist.
Es ist eine Erweiterung der Rexx Programmiersprache (oft als „Classic Rexx“ bezeichnet), die alle Funktionen und die Syntax beibehält, aber objektorientierte Programmierung (OOP) und andere Erweiterungen hinzufügt. Dem Einfluss von Classic Rexx folgend, ist ooRexx so konzipiert, dass die Programmiersprache leicht zu erlernen und zu benutzen ist und der Quelltext einfach zu pflegen ist. Konformität mit dem „Information Technology - Programming Language REXX“ ANSI X3.274-1996[1] Standard gewährleistet plattformübergreifende Interoperabilität mit anderen konformen Rexx Implementierungen. Daher laufen Classic Rexx Programme in der Regel ohne Änderungen unter ooRexx.
Es gibt auch Rexx Object Oriented („roo!“), eine weitere Implementierung, die ursprünglich von Kilowatt Software entwickelt wurde und nicht mehr weiter entwickelt wird.[2]
Geschichte
[Bearbeiten | Quelltext bearbeiten]Im Jahr 1988 wurde im Rahmen des „Oryx“-Projekt bei IBM unter der technischen Leitung von Simon C. Nash mit der Verschmelzung von Classic Rexx und dem Objektmodell von Smalltalk experimentiert.[3][4] Ziel des Projektes war es, die Vorteile des objektorientierte Paradigmas auf Classic Rexx zu übertragen und gleichzeitig die Benutzerfreundlichkeit von Classic Rexx in die Welt der OOP zu bringen.[5] Schon früh konzentrierte man sich daher darauf, alles als Objekte zu betrachten, Kapselung, Nachrichtenaustausch, objektbasierte Nebenläufigkeit, Klassen und Vererbung.[6]
Diese anfängliche Arbeit führte später unter der Leitung von Rick McGuire zum ersten Prototyp von Object REXX, der 1992 vorgestellt wurde. Im Jahr 1994 kündigte IBM an, dass Object REXX den Classic Rexx Interpreter in der nächsten Version von OS/2 ersetzt.[4] Objekt REXX wurde 1996 offiziell als Teil des Betriebssystems OS/2 Warp 4 veröffentlicht.[7] Im Folgejahr kamen Versionen für Windows 95, Windows NT und Linux auf den Markt.[8][9] Eine Version für AIX V4.1.5+ wurde 1999 eingeführt, und Versionen für zLinux und Sun/Solaris folgten im Jahr 2000.[10] Das letzte Update für Windows 2000, Windows Me, Windows 98 und Windows NT 4.0 wurde 2001 herausgegeben.[11]
Am 12. Oktober 2004 kündigte IBM die Einstellung von Object REXX an und übertrug den Quelltext und die Lizenzrechte an die Rexx Language Association (RexxLA). Der von IBM freigegebene Quelltext enthielt nicht die nötigen Klassen für die Unterstützung des IBM System Object Model (SOM) und der Workplace Shell (WPS). Die letzte OS/2-Version von Object REXX enthält diese nötigen Klassen, welche auch für die Nachfolgeprodukte von OS/2, eComStation und ArcaOS, lauffähig sind.[12][13][14]
Im Jahr 2005 veröffentlichte die RexxLA mit ooRexx 3.0.0 eine neue Inkarnation von Object REXX unter der Common Public License.[15] Der Quelltext dieser Version wurde stark überarbeitet, um die Lesbarkeit zu verbessern. Später wurde der ooRexx-Kernel in C++ umgeschrieben, und eine neue Architektur und native Schnittstellen unter der technischen Leitung von Rick McGuire entworfen und umgesetzt. Diese Arbeit ermöglichte es der RexxLA, ooRexx 4.0.0 mit 64-Bit Unterstützung im Jahr 2009 zu veröffentlichen. Die RexxLA entwickelt und pflegt weiterhin ooRexx, Classic Rexx (Regina) sowie NetRexx und organisiert jährlich internationale Symposien.[16]
Versionsüberblick
[Bearbeiten | Quelltext bearbeiten]Die folgende Tabelle gibt einen Überblick über die wichtigsten Versionen von Object REXX und ooRexx. Alle veröffentlichten ooRexx-Versionen und die dazugehörige Dokumentation sind auf Sourceforge frei verfügbar.[17][18] Für Arch Linux basierte Distributionen sind die aktuelle und die Entwicklungsversion jeweils als Arch User Repository verfügbar. Seit Version 5.0.0 gibt es portable Versionen des Interpreters, die ohne Installation verwendet werden können. Für IntelliJ IDEA bietet das ooRexxPlugin Unterstützung für Syntaxhervorhebung, Syntaxprüfung, Autovervollständigung und Dokumentation unter Verwendung von Annotationen nach dem Vorbild von Javadoc.[19]
Version | Veröffentlichung | Anmerkungen |
---|---|---|
1.0.0 (OS/2)[7] |
Object REXX25. Sep. 1996 |
|
1.0.0 (Windows)[8] |
Object REXX28. Feb. 1997 |
|
1.1.0 (AIX)[10] |
Object REXX9. Apr. 1999 |
|
2.1.0 (Windows)[11] |
Object REXX21. Apr. 2001 |
|
3.0.0[20][21] |
ooRexx30. März 2005 |
|
3.1.0[20] |
ooRexx21. Aug. 2006 |
|
3.1.1[20] |
ooRexx23. Nov. 2006 |
|
3.1.2[20] |
ooRexx17. Sep. 2007 |
|
3.2.0 |
ooRexx22. Jan. 2008 |
|
4.0.0[22] |
ooRexx30. Sep. 2009 |
|
4.1.0[23] |
ooRexx28. Sep. 2011 |
|
4.2.0[25] |
ooRexx23. Feb. 2014 |
|
5.0.0[26] |
ooRexx22. Dez. 2022 |
|
5.1.0 |
ooRexx19. Sep. 2024 |
|
Legende: Alte Version Aktuelle Version Aktuelle Vorabversion |
Sprachdesign
[Bearbeiten | Quelltext bearbeiten]Das Sprachdesign von ooRexx folgt der Philosophie von Classic Rexx, die darauf abzielt, eine „menschenzentrierte“ Programmiersprache anzubieten, die leicht zu erlernen, zu programmieren, zu merken und zu pflegen ist. Diese Ziele werden zum Teil dadurch erreicht, dass der Sprachumfang klein gehalten wird und die Sprache dem Principle of Least Surprise folgt.[2][27] Eine lesbare Syntax wird durch das Ignorieren von Groß- und Kleinschreibung, freie Formatierung, die Verwendung weniger Interpunktion und Anweisungen in einfachem Englisch ermöglicht.[27] Außerdem handelt es sich um eine dynamische Programmiersprache, was Flexibilität ermöglicht und es erlaubt, sich auf die Entwicklung und nicht auf sprachliche Beschränkungen zu konzentrieren. Dem Designprinzip „Dokumentation vor Implementierung“ folgend, bietet ooRexx eine umfassende Dokumentation gemäß dem IBM Style Guide, mit Syntaxdiagrammen und Beispielen.[27][28]
Anweisungen
[Bearbeiten | Quelltext bearbeiten]
Wie in Classic Rexx gibt es Zuweisungs-, Schlüsselwort- und Befehlsanweisungen. Im Einklang mit dem Ziel, die Sprache klein zu halten, hat ooRexx 5.0.0 nur dreißig Schlüsselwortanweisungen.[28] Im Gegensatz zu vielen anderen Sprachen sind keine Schlüsselwörter reserviert, so dass es nicht notwendig ist, eine reservierter Wörter vorab zu lernen.[29] Wenn eine Anweisung weder als Zuweisungs- noch als Schlüsselwortanweisung erkannt wird, gilt sie als Zeichenkette oder, falls es sich um einen gültigen Befehl handelt, als Befehlsanweisung und wird zur Ausführung an das Betriebssystem übergeben. Nach der Ausführung wird die Variable RC
mit dem Rückgabewert gefüllt. Darüber hinaus ermöglicht die Anweisung ADDRESS
die Umleitung von Befehlen in bestimmte Befehlsumgebungen wie Bourne Shell, Bash, Z-Shell, CMD oder einige Editoren wie ISPF, TSO EDIT, XEDIT und andere. Mit ADDRESS
können auch Fehler abgefangen werden.
a = "Hallo Welt" /* Zuweisungsanweisung */
do i = 1 to 2 /* Stichwortanweisung "DO" */
say "Runde #" i":" a /* Stichwortanweisung "SAY" */
end /* Stichwortanweisung "END" */
"echo Hallo Welt" /* Befehl an das Betriebssystem */
say "RC:" rc /* numerische Rückgabewert des Befehls */
Zusätzlich zu den drei Anweisungstypen von Classic Rexx fügt ooRexx Direktiven hinzu, die am Ende des Quelltextes platziert werden müssen. Nach dem Laden und Prüfen der Syntax führt der Interpreter alle definierten Direktiven aus, um die Ausführungsumgebung einzurichten, bevor er weitere Anweisungen verarbeitet werden. Direktiven können verwendet werden, um Routinen, Klassen, Methoden, Attribute oder Ausführungsoptionen wie zum Beispiel die Genauigkeit der Arithmetik zu definieren. Um Direktiven leicht erkennbar zu machen, werden sie mit zwei aufeinander folgenden Doppelpunkten (::
) eingeleitet.[28]
Um die Wiederverwendbarkeit von Code zu erleichtern, ermöglicht die ::REQUIRES
Direktive die Integration eines anderen Rexx-Programms (auch als Paket bezeichnet) oder einer externen (nativen) Bibliothek. Diese Direktive veranlasst den Interpreter, jede Routine und Klasse, welche die PUBLIC
Option spezifiziert, direkt zugänglich zu machen. Externe Pakete verwenden üblicherweise die Dateierweiterung .cls
, zum Beispiel ::requires "csvstream.cls"
oder ::requires "json.cls"
. Einige externe Pakete und Bibliotheken werden mit dem ooRexx-Interpreter ausgeliefert.
Freie Formatierung
[Bearbeiten | Quelltext bearbeiten]
Die Positionierung des Quelltextes ist bei ooRexx irrelevant, was ein hohes Maß an Flexibilität ermöglicht. Vor der Ausführung fügt der Interpreter mehrere nicht in Anführungszeichen stehende Leerzeichen zu einem zusammen, während eine in Anführungszeichen (einfach oder doppelt) eingeschlossene Zeichenkette nicht verändert wird. Zur Verkettung können zwei senkrechte Linien (||
), die Trennung von Begriffen mit Leerzeichen oder aneinanderstoßende Begriffe verwendet werden. Optional können Codezeilen auf mehrere Zeilen verteilt werden, indem das Komma (,
) oder das Minuszeichen (-
) als Fortsetzungszeichen verwendet wird. Außerdem können mehrere Zeilen durch ein Semikolon (;
) in einer einzigen Zeile zusammengefasst werden.[28] Da durch freie Formatierung weniger syntaktische Regeln berücksichtigt werden müssen, wird davon ausgegangen, dass dies den Lernaufwand reduziert, indem die intrinsische kognitive Belastung verringert wird.[30]
say "Hallo Welt!" /* Ausgabe: Hallo Welt!! */
say " Das" 'ist' - /* nachfolgender Strich für die Weiterführung */
"REXX" || "!" /* Ausgabe: Das ist REXX! */
Case-insensitive
[Bearbeiten | Quelltext bearbeiten]Wie bei Classic Rexx spielt auch bei ooRexx die Groß- und Kleinschreibung keine Rolle. Der Interpreter macht automatisch alle Zeichen außerhalb von Anführungszeichen groß, bevor er diese ausführt. Da nicht zwischen Groß- und Kleinbuchstaben unterschieden werden muss, müssen weniger zusätzliche Details erlernt werden, was Syntaxfehler verhindern kann.[30]
a = "Das ist REXX!"
Say A /* Ausgabe: Das ist REXX! */
SAY a /* Ausgabe: Das ist REXX! */
Alles ist ein Objekt
[Bearbeiten | Quelltext bearbeiten]
Während Classic Rexx der „Alles ist eine Zeichenkette“ Philosophie folgt und Zeichenkette als einzigen Datentyp hat, betrachtet ooRexx alles als Objekte, einschließlich Zeichenketten, Arrays, Streams und viele andere. Objekte werden mit Methoden anstelle von traditionellen Funktionen manipuliert. In ooRexx ist eine Variable, die eine Zeichenkette enthält, ein Verweis auf ein Zeichenketten-Objekt. Dieses Objekt muss nicht deklariert werden, was den Aufwand im Vergleich zu streng typisierten Sprachen reduziert.[31] Ein Zeichenketten-Objekt kann beliebige Zeichen enthalten, einschließlich numerischer Werte. Es ist daher möglich, numerische Werte mit Methoden der Zeichenketten-Klasse (String
) zu manipulieren. Darüber hinaus kann eine Zeichenkette jeden Art von Ausdruck enthalten, einschließlich ausführbarer Anweisungen, welche mit dem Schlüsselwort INTERPRET
ausgeführt werden können.[28]
a = 2 /* Zeichenkette mit numerischem Wert */
a = a || '0' /* resultierende Zeichenkette: 20 */
str = "do i = 1 to "a"; say i; end" /* Zeichenkette mit Schleifenanweisung */
interpret str /* Interpretieren: Zählen bis 20 */
Nachrichten-Paradigma
[Bearbeiten | Quelltext bearbeiten]Ähnlich wie bei dem von Alan Kay in Smalltalk implementiertem Nachrichten-Paradigma kann mit Objekten durch die Benennung von Methoden mit Hilfe von Nachrichten kommuniziert werden.[29] Im Gegensatz zu Smalltalk gibt es einen expliziten Nachrichtenoperator, die Tilde (~
), mit dem Empfangsobjekt links davon und dem Ergebnis der Operation als Rückgabe. Das Versenden einer Nachricht führt zur Aktivierung einer Methode mit dem entsprechenden Methodennamen und zur Manipulation des empfangenen Objekts. Wie bei Smalltalk können Nachrichten kaskadiert werden, wenn zwei Tilden (~~
) statt einer verwendet werden, wobei das empfangende Objekt und nicht das erzeugte Ergebnis zurückgegeben wird.[32]
Das Grundverhalten der meisten Methoden kann durch Angabe einer Option geändert werden. Diese Option kann entweder ausgeschrieben oder abgekürzt werden und auch hier spielt die Groß- und Kleinschreibung keine Rolle. Dies ermöglicht beim Lesen von Code ein wortgetreues Verständnis und verringert den Lernaufwand für Anfänger, da die Bedeutung von Abkürzungen nicht gelernt werden muss.[30] Die Methode mit dem Namen Strip
entfernt standardmäßig führende und nachgestellte Leerzeichen. Dieses Verhalten kann zum Beispiel durch die Angabe von „leading“
oder „l“
als Option geändert werden. Während Funktionen in Classic Rexx verschachtelt sind, können Nachrichten in ooRexx verkettet werden, was die Lesbarkeit verbessert.[29]
a = " Ich bin ooRexx!"
say a /* Ausgabe: Ich bin ooRexx! */
say a~Strip("Leading") /* Ausgabe: Ich bin ooRexx! */
say a~strip("l")~reverse /* Ausgabe: !xxeRoo nib hcI */
Plattformübergreifende Interoperabilität
[Bearbeiten | Quelltext bearbeiten]ooRexx ist so konzipiert, dass alle Merkmale von Classic Rexx beibehalten werden und entspricht im Wesentlichen dem ANSI-Standard für die Rexx-Sprache (X3.274-1996, „Programming Language REXX“).[1] Entgegen einer optionalen Spezifikation im Standard erlaubt ooRexx keine Zeichen wie @
, #
, $
und ¢
in Symbolen. Während der Ausdruck b. = a.
in Classic Rexx dazu führt, dass b.
dem Wert enthalten in a.
zugewiesen wird, macht ooRexx b.
zu einem Alias für a.
. Außerdem erlaubt ooRexx --
als Kommentarzeichen und -
als Fortsetzungszeichen, was nicht im Standard spezifiziert ist.[1]
Rexx-Skripte laufen in der Regel ohne Änderungen unter ooRexx, so dass eine Migration zur OOP leicht möglich ist, ohne dass die in den ursprünglichen Code investierte Zeit verloren geht.[2] Da der Interpreter eine große Anzahl an Plattformen und Betriebssysteme unterstützt, ist eine Migration auf diese möglich.
Merkmale
[Bearbeiten | Quelltext bearbeiten]Insbesondere hat ooRexx objektorientierte Merkmale wie Vererbung, Polymorphismus, Datenkapselung und Mehrfachvererbung über Mixin-Klassen. Der Interpreter enthält das Dienstprogramm rexxc
, das es ermöglicht, ooRexx-Programme zu kompilieren und optional als Base64 zu kodieren, was den Programmstart beschleunigt, da das erste Parsen und Kompilieren bereits erfolgt ist.[32]
Parsing
[Bearbeiten | Quelltext bearbeiten]
Die PARSE
Schlüsselwortanweisung ermöglicht es, eine Zeichenkette schnell und flexibel zu zerlegen und Teile davon in einem einzigen Schritt verschiedenen Variablen zuzuweisen.[2] Die nachfolgende Anweisung spezifiziert die Quelle der zu zerlegenden Zeichenkette, so zum Beispiel ARG
für Argumente die beim Aufruf eines Programms oder einer Funktion gelistet werden, VAR
für Variablen, PULL
für Warteschlangen oder den Standard-Input (typischerweise die Tastatur) und VALUE
für einen beliebigen Ausdruck. Bei der Verwendung von VALUE
ist das Schlüsselwort WITH
erforderlich, um das Ende eines Ausdrucks anzugeben, gefolgt von einem Parsing-Muster. Ein solches Muster kann eine Liste von Variablen, Positionsnummern oder buchstäblichen Begrenzungszeichen sein; es ist möglich, diese Muster in Kombination zu verwenden.[28]
str = "Person: Rick McGuire"
/* Parsen der Zeichenkette mit dem Literal „:“ und Leerzeichen zwischen den
Wörtern in die Variablen a ("Person"), b ("Rick"), und c ("McGuire") */
parse var str a ":" b c /* Parsen nach Literal und Leerzeichen */
say b c /* Ausgabe: Rick McGuire */
Prozedur und Funktion
[Bearbeiten | Quelltext bearbeiten]
ooRexx bietet die Möglichkeit, mit der ::ROUTINE
Direktive Prozeduren und Funktionen zu definieren, die nicht klassengebunden sind. Die CALL
Anweisung kann verwendet werden, um eine Routine als Prozedur aufzurufen. Darüber hinaus können Routinen, die mit Hilfe der RETURN
Schlüsselwortanweisungen Werte zurückgeben, über Funktionsaufrufe aktiviert werden, indem der Name der Routine, gefolgt von Klammern, angegeben wird. Der Inhalt der Klammern wird als Argument an eine Routine übergeben. Mit der PARSE
Anweisung können die empfangenen Argumente zerlegt und Variablen zugewiesen werden.[28]
call MacheEtwas /* "CALL" Stichwortanweisung */
Summe = MeineFunktion("2","4") /* Funktionsaufruf */
say Summe /* Ausgabe: 6 */
::Routine MacheEtwas /* "ROUTINE" Direktive (Prozedure) */
say "Ich habe was getan!" /* Ausgabe: Ich habe was getan! */
::Routine MeineFunktion /* "ROUTINE" Direktive (Funktion) */
parse arg FirstVar, SecondVar /* Argumente an Variablen zuweisen */
Summe = FirstVar + SecondVar /* Berechnung durchführen */
return Summe /* "RETURN" Ergebnis */
Klasse und Methode
[Bearbeiten | Quelltext bearbeiten]
Die Anweisung ::CLASS
gefolgt von einem Klassennamen veranlasst den Interpreter, eine neue Klasse zu definieren. Nach dem Klassennamen können Optionen wie METACLASS
, SUBCLASS
, MIXINCLASS
, ABSTRACT
und INHERIT
gesetzt werden. Die ::METHOD
Direktive kann verwendet werden, um eine neue Klassenmethode zu definieren, die mit der vorangegangenen ::CLASS
Direktive verknüpft ist. Die ::ATTRIBUTE
Anweisung wird verwendet, um eine Zugriffsfunktion zum Abrufen oder Zuweisen einer Objektvariablen zu definieren. Mit EXPOSE kann eine Objektvariable direkt einer Methode zugänglich gemacht werden.[28]
d = .dog~new("Bella") /* einen Hund anlegen und zuweisen */
d~bark /* Bellen Nachricht senden */
say d~name /* Ausgabe: Bella */
::class dog /* "CLASS" Direktive */
::attribute name /* "ATTRIBUTE" Direktive */
::method init /* Objektinitiierungsmethode */
Expose name /* enthüllt den Namen des Hundes */
Parse arg name /* weist "Bella" als Namen zu */
::method bark /* "METHOD" Direktive */
Expose name
say Name "macht wuff!" /* Ausgabe: Bella macht wuff! */
Multi-threading
[Bearbeiten | Quelltext bearbeiten]ooRexx implementiert objektbasierte Nebenläufigkeit, bei welcher Objekte über unabhängige Ressourcen zur Ausführung von Methoden verfügen. Mehrere Objekte können gleichzeitig aktiv sein und Nachrichten zur Synchronisation austauschen.[28] Um Nebenläufigkeit zu erreichen, kann die REPLY
Anweisung verwendet werden, die eine frühzeitige Rückkehr aus einer Methode bewirkt, während ihr Rest in einem neuen Thread weiter ausgeführt wird. Darüber hinaus kann die GUARD
Anweisung verwendet werden, um eine Methode als ungeschützt festzulegen, so dass sie zusammen mit anderen Methoden der gleichen Klasse ausgeführt werden kann. Schließlich ermöglicht die Verwendung der START
Methode (Object
oder Message
Klasse) dem Empfänger, eine empfangende Nachricht in einem separaten Thread zu verarbeiten.[28]
Tracing
[Bearbeiten | Quelltext bearbeiten]Wie in Classic Rexx kann sowohl das Schlüsselwort TRACE
als auch die eingebaute Funktion TRACE()
für die Fehlersuche verwendet werden. Der Detaillierungsgrad lässt sich steuern und das interaktive Debugging kann zur Laufzeit aktiviert werden.[33] Während des interaktiven Debuggings hält der Interpreter nach den meisten zu überwachenden Anweisungen an.[28] ooRexx 5.1.0 führt die Klasse TraceObject
ein, die zusätzliche Informationen wie Zeitstempel, Interpreter-Instanzen, Thread-IDs, auf denen Nachrichten versendet werden, und den Zustand der Guard Locks für das Tracing von Multi-Thread-Programmen liefert. Mit dieser Klasse lässt sich leichter feststellen, welche Methode gerade bewacht und blockiert wird.[33]
Integrierte Funktionen und Klassen
[Bearbeiten | Quelltext bearbeiten]Da ooRexx darauf abzielt, mit Classic Rexx kompatibel zu sein, sind dessen integrierte Funktionen weiterhin verfügbar.[32] Release 5.0.0 enthält 82 Funktionen, einschließlich Zeichenmanipulation, Konvertierung und Informationsfunktionen, von denen viele Methoden der String
Klasse aufrufen. Darüber hinaus bietet die mitgelieferte Bibliothek RexxUtil 29 plattformübergreifende, 25 Windows-spezifische und vier Unix-spezifische Funktionen zur Manipulation von Systemdateien, Verzeichnissen, Klassen und Objekten.[28] Im Einklang mit seinen objektorientierten Wurzeln stellt ooRexx den Großteil seiner Funktionalität über eingebaute Klassen und Methoden zur Verfügung. ooRexx 5.0.0 wird mit insgesamt 57 Klassen ausgeliefert, die in die Klassengruppen Fundamental, Stream, Collection und Utility unterteilt sind.[28]
Fundamental
[Bearbeiten | Quelltext bearbeiten]Klassen dieser Gruppe sind die wesentlichen Bausteine aller anderen Klassen. Die Klasse Object
ist die Wurzel der Klassenhierarchie, so dass ihre Methoden und Attribute für alle instanziierten Objekte jeder Klasse verfügbar sind. Die Metaklasse Class
dient zur Verwaltung der Eigenschaften andere Klassen (z. B. ihrer Methodenobjekte) und wird zur Erzeugung von Instanzen (Objekte) verwendet. Daher wird für jede ::CLASS
Direktive eine Instanz dieser Klasse (auch Klassenobjekt genannt) erzeugt.[28] Der Zweck der Method
Klasse und der Routine
Klasse besteht darin, Methoden- oder Routinenobjekte zu erzeugen. Die Klasse String
bietet Methoden für die Verarbeitung von Zeichenketten, wie z. B. logische Operationen, Verkettung, Kopieren, Verbinden, Aufteilen, Umkehren, Arithmetik, Konvertierung usw.[32] Eine Instanz der Klasse Package
enthält alle Routinen, Klassen und Methoden und verwaltet externe Abhängigkeiten, welche durch die ::REQUIRES
Direktiven inkludiert werden. Die Klasse Message
ermöglicht das asynchrone Versenden von Nachrichten, was die gleichzeitige Ausführung von Methoden ermöglicht.[28][32]
Stream
[Bearbeiten | Quelltext bearbeiten]
Stream-Klassen erleichtern die Kommunikation mit externen Objekten wie Dateien, Warteschlangen, seriellen Schnittstellen und Geräten. Die Stream
Klasse selbst ist eine Mixin-Klasse, die vererbt werden kann und eine Unterklasse der Klassen InputOutputStream
, InputStream
und OutputStream
ist.[28] Die Klasse Stream
bietet Methoden zum Öffnen, Lesen, Schreiben und Schließen von Streams und zum flushen von Puffern, zum Festlegen des Dateispeicherorts, zum Abrufen von Informationen und zu anderen Stream-bezogenen Operationen. Während die OPEN
Methode den Stream öffnet, kann die ARRAYIN
Methode verwendet werden, um seinen Inhalt in ein Array-Objekt zu lesen. Die CLOSE
Methode schließt einen Stream explizit, bevor das Stream-Objekt vom Garbage Collector zurückgefordert wird.[28][32]
StreamObj = .stream~new("eineDatei.txt") /* Stream-Objekt erstellen */
StreamObj~open /* den Stream öffnen */
DateiInhalt = StreamObj~ArrayIn /* Inhalt lesen */
StreamObj~close /* den Stream schließen */
say DateiInhalt /* Ausgabeinhalt */
Collection
[Bearbeiten | Quelltext bearbeiten]Eine Sammlung ist ein Objekt, das mehrere Elemente mit zugehörigen Indizes enthält, die das Abrufen von Elementen mit den Methoden AT
oder []
ermöglichen. Es gibt die Klassen MapCollection
, SetCollection
und OrderedCollection
, welche die Manipulation eines bestimmten Sammlungstyps ermöglichen.[32]
Eine MapCollection ist eine Mixin-Klasse, die Methoden für Sammlungen definiert, die von einem Index auf einen Wert mappen. Die Klassen Directory
, StringTable
, IdentityTable
, Properties
, Table
, Relation
und Stem
erben diese Methoden.[28] Ein Directory- oder StringTable-Objekt ist eine Sammlung von eindeutigen String-Indizes. In einem IdentityTable-Objekt ist jedes Element mit einem einzigen Index verbunden, und es kann nur ein Element für jeden Index geben. Das Properties-Objekt bietet spezielle Methoden zum Speichern und Laden von Eigenschaften in Dateien. Im Gegensatz zu einem Table-Objekt, das keine doppelten Indizes enthalten kann, ist ein Relation-Objekt eine Sammlung, in der Elemente denselben Index haben können, der von jedem Objekttyp sein kann.
Ein Stem-Objekt wird automatisch erstellt, wenn eine zusammengesetzte Variable verwendet wird. Wie in Classic Rexx besteht eine solche Variable aus einem Stamm und einem Endteil, getrennt durch einen Punkt (.
). Während der Stamm mit einem Buchstaben beginnen muss, kann das Ende ein beliebiges Zeichen sein. Die Verwendung eines numerischen Endes erzeugt den gleichen Effekt wie ein Array, während mehrere numerische Enden verwendet werden können, um ein multidimensionales Array zu erzeugen.[28][32]
Obst.1 = "Apfel" /* Zuweisung an Stem-Variable */
Obst.4 = "Orange" /* Zuweisung an Stem-Variable */
say Obst.4 /* Ausgabe: Orange */
say Obst.[1] /* Ausgabe: Apfel */
SetCollections sind spezielle Typen von MapCollections, bei denen der Index und das Element dasselbe Objekt sind. Während die Indizes in einem Set-Objekt eindeutig sind, kann jeder Index mehr als einmal in einem Bag-Objekt vorkommen.[28]
Eine OrderedCollection ist eine Mixin-Klasse, die die grundlegenden Methoden für alle Sammlungen definiert, die eine inhärente Indexreihenfolge haben, wie zum Beispiel List
, Queue
, CircularQueue
und Array
. Ein Liste-Objekt ermöglicht das Hinzufügen neuer Elemente, für die jeweils ein neuer Index erstellt wird, an jeder Position in einer Sammlung. Der zugehörige Index bleibt für dieses Element unabhängig von anderen Hinzufügungen oder Entfernungen gültig. Bei einem Queue-Objekt können Elemente vom Anfang der Warteschlange entfernt und an das Ende oder den Anfang hinzugefügt werden. Ein CircularQueue-Objekt ist eine Warteschlange mit einer vordefinierten Größe. Sobald das Ende der CircularQueue erreicht ist, werden neue Elemente am Anfang eingefügt, um die vorhergehenden Elemente zu ersetzen.[28][32] Ein Array ist eine sequentielle Sammlung, die nach ganzzahligen Indizes geordnet ist. Wie einige andere Sammlungsklassen bietet die Klasse Array die Methode MAKESTRING
, um ihre Elemente als Zeichenkette zu kodieren.[28]
ArrayObj = .array~of("Einz", "Zwei", "Drei") /* Array mit 3 Elementen */
say ArrayObj~at(2) /* Ausgabe: Zwei */
say ArrayObj~makeString(,"; ") /* output: Einz; Zwei; Drei */
Utility
[Bearbeiten | Quelltext bearbeiten]
Es gibt 31 Utility-Klassen, die Implementierungen für allgemeine Aufgaben bieten. Die Klasse MutableBuffer
ermöglicht eine größere Effizienz bei Zeichenketten-Operationen wie der Verkettung, da kein neues Objekt zugewiesen werden muss. Die Klasse File
bietet Methoden für das Auflisten von Dateien in einem Verzeichnis oder das Abrufen von Informationen über Dateien und Verzeichnisse.[28]
FileObj = .File~new("~/einOrdner/") /* Datei-Objekt für Ordner erstellen */
FileArr = FileObj~ListFiles /* Array von Dateien abrufen */
do DateiPfad over FileArr /* Iteration über die Array-Elemente */
say DateiPfad /* Ausgabe: DateiPfad-Item */
end
Die DateTime
oder TimeSpan
Klassen unterstützen das Abrufen und Formatieren eines Datums, einer Uhrzeit oder eines Zeitstempels in verschiedenen Formaten und ermöglichen arithmetische Operationen zwischen ihnen. Mehrere Comparator-Klassen erleichtern das Sortieren für eingebaute Klassen wie File, DateTime und andere. Die Klasse Supplier
und ihre Unterklasse StreamSupplier
ermöglichen die Aufzählung einer Elementsammlung zusammen mit einer Indexsammlung. Die Klasse Validate
bietet Methoden, mit denen geprüft werden kann, ob gegebene Argumente von der richtigen Klasse und vom richtigen Typ sind oder innerhalb eines numerischen Bereichs liegen. Eine VariableReference-Instanz verwaltet einen Verweis, während eine WeakReference-Instanz einen Verweis auf ein anderes Objekt erzeugt, das nicht gepinnt ist.[28]
Ein regulärer Ausdruck ist ein Muster, das für die Suche von Zeichenketten verwendet werden kann. Um die Lesbarkeit von Mustern im Code zu erhöhen, erlaubt die Klasse RegularExpression
die Verwendung von symbolischen Namen, die mit Doppelpunkten (:
) gekapselt sind. So kann beispielsweise eine Zeichenkette, die nur Buchstaben enthält, die normalerweise als [A-Za-z]
beschrieben wird, mit [:alpha:]
abgekürzt werden.[28]
Andere Klassen helfen dabei, über den Kontext des aktuell ausgeführten Codes (RexxContext
), die Rexx-Sprache oder die ausführende Plattform (RexxInfo
) und Ausführungsspezifika (StackFrame
) Informationen zu erhalten. Die Klassen Buffer
und Pointer
sind speziell für die Unterstützung des Schreibens von Methoden und Funktionen in nativem Code unter Verwendung der C/C++ Programmierschnittstellen konzipiert. Die Klassen Alarm
und Ticker
bieten Benachrichtigungsfunktionen und die Klassen EventSempahore
und MutexSempahore
implementieren Synchronisationsmechanismen für Multithreading-Aktivitäten. Die Klasse Monitor
ermöglicht die Weiterleitung von Nachrichten an verschiedene Zielobjekte und die Klasse RexxQueue
bietet einen objektähnlichen Zugriff auf externe Rexx-Datenwarteschlangen.[28]
Externe Pakete und Bibliotheken
[Bearbeiten | Quelltext bearbeiten]Mit der Direktive ::REQUIRES
und der Option LIBRARY
können externe Bibliotheken in ein Programm integriert werden. Solche Bibliotheken sind normalerweise anhand von bereichsspezifischen Funktionen organisiert.[28]
Die Rexx-Erweiterungsbibliothek bietet Klassen zum Lesen und Schreiben von CSV-Dateien (Comma-Separated Values) sowie zur Erstellung und Verarbeitung von JSON-Daten (JavaScript Object Notation). Außerdem ist eine Bibliothek namens „hostemenu“ enthalten, die teilweise eine TSO/CMS-Umgebung emuliert.[34] Die Bibliothek RxSock
ermöglicht die Einbindung von TCP/IP-Protokollen,[35] während die Bibliothek RxFtp
[36] speziell den Zugriff auf das FTP-Protokoll ermöglicht. Die native Bibliothek RxMath
bietet erweiterte mathematische Funktionen wie Quadratwurzelberechnung, Exponentialfunktion, Logarithmus, Sinus, Kosinus, Tangens, Arcussinus und Potenzberechnung.[37]
Say rxcalcsin(1) /* Ausgabe: 0.0174524064 */
::requires 'rxmath' LIBRARY /* eine native Bibliothek laden */
Für Windows ist das ooDialog-Framework enthalten, mit dem Windows-Dialoge und damit grafische Benutzeroberflächen erstellt werden können.[38] Der Interpreter wird mit mehreren Beispielprogrammen und Funktionspaketen ausgeliefert, die die Verwendung dieses Frameworks demonstrieren.[32] Für POSIX-kompatible Betriebssysteme ermöglicht die orxnCurses-Klassenbibliothek das Schreiben von zeichenorientierter Benutzerschnittstellen unter Verwendung der ncurses-Programmierbibliothek.[39] Die RxUnixSys-Bibliothek bietet auf den meisten Unix-Systemen Funktionen für die Interaktion mit Prozessen und Threads, Benutzern und Benutzergruppen, Dateien und Dateisystemen und anderen.[40] Viele dieser externen Pakete und Bibliotheken sind auch mit anderen Rexx-Implementierungen kompatibel.
Sprachbrücken
[Bearbeiten | Quelltext bearbeiten]Während ooRexx im Vergleich zu Object REXX keine Klassen für SOM- und WPS-Unterstützung mehr enthält, bietet es Programmierschnittstellen zur Interaktion mit in C oder C++ geschriebenem Code.[41] Es gibt auch eine externe Bibliothek, die eine bidirektionale Java-Brücke implementiert, welche die Interaktion zwischen ooRexx und Java ermöglicht.[29] Außerdem werden Klassen zur Automatisierung von Windows-Anwendungen bereitgestellt. Die Klasse ooSQLite bietet eine Schnittstelle zu SQLite, einer prozessinternen Bibliothek, die eine in sich geschlossene, serverlose, konfigurationsfreie, transaktionale SQL-Datenbank-Engine implementiert.[42]
C/C++ APIs
[Bearbeiten | Quelltext bearbeiten]Wie Classic Rexx enthält ooRexx Programmierschnittstellen zur Erweiterung von Rexx mit in C geschriebenen Anwendungen und umgekehrt. Dies ermöglicht die Erstellung von Rückruffunktionen für Unterbefehle, die in Rexx-Programmen verwendet werden, die als Makros laufen, externe Funktionen, die eine direkte Erweiterung des ooRexx-Funktionssatzes ermöglichen, und Systemfunktionen, mit denen das Verhalten des Interpreters angepasst werden kann.[41]
Mit ooRexx 4.0.0 wurden Schnittstellen eingeführt, die es C++ Anwendungen ermöglichen, ooRexx zu erweitern und vice versa. Dazu gehören Rückruffunktionen für in C++ geschriebene Methoden und Funktionen, die ooRexx erweitern können und als externe Bibliotheken verpackt sind. Diese werden unter Windows als Dynamic Link Libraries und auf Unix-basierten Systemen als Shared Libraries bezeichnet. Eine externe Bibliothek kann mit der ::REQUIRES
Direktive oder mit der EXTERNAL
Schlüsselwortanweisung als Teil einer ::ROUTINE
, ::METHOD
oder ::ATTRIBUTE
Direktive geladen werden.
Java
[Bearbeiten | Quelltext bearbeiten]
Unter Verwendung der C++ Schnittstellen wurde BSF4ooRexx als bidirektionale Java-Bridge auf der Grundlage des Bean Scripting Framework entwickelt. Diese Brücke ermöglicht ooRexx die Kommunikation mit Java-Objekten und Java die Interaktion mit Rexx-Anwendungen.[43][44] Die Brücke wird durch das ooRexx-Paket BSF.CLS
integriert, welches öffentliche Routinen, Klassen und das Umgebungssymbol .BSF4REXX
definiert.[44] Beispiele für die Verwendung von Java-Klassen in Verbindung mit AWT, Swing, JavaFX, JDBC, Java 2D und einigen anderen werden bereitgestellt.[43]
/* Java-Objekt erstellen */
frame=.bsf~new("javax.swing.JFrame", "Hello, my beloved world - from ooRexx!")
frame~setSize(410,20) /* Breite und Höhe festlegen */
frame~visible=.true /* JFrame sichtbar machen */
call SysSleep 10 /* zehn Sekunden lang schlafen */
::requires "BSF.CLS" /* Java-Unterstützung erhalten */
Basierend auf BSF4ooRexx wird die Interaktion mit Universal Network Objects (UNO), wie sie in OpenOffice und LibreOffice verwendet werden, über das UNO.CLS
Paket unterstützt.[45] Darüber hinaus ermöglicht das CLR.CLS
Paket zusammen mit Jini4Net die Nutzung des .NET-Frameworks.[46] Die Kommunikation mit Prozessen über die D-Bus unter Linux ist über das DBUS.CLS
Paket möglich.[47]
Windows Automatisierung
[Bearbeiten | Quelltext bearbeiten]Die Windows-Erweiterung umfasst die Windows Script Host (WSH) Engine, welche zur Durchführung allgemeiner Automatisierungsaufgaben verwendet werden kann. Diese beinhaltet auch die Unterstützung von Object Linking and Embedding/ActiveX (OLE), was es möglich macht, mit Windows-Programmen über das OLEObject zu interagieren.[48] OLE Automation ist ein von Microsoft entwickelter Interprozess-Kommunikationsmechanismus, der auf einer Teilmenge des Component Object Model (COM) basiert. Dieser Mechanismus ermöglicht unter anderem den Aufruf von Programmfunktionen, das Abfragen und Setzen von Attributen und das Abfangen von Komponentenereignissen. Der ooRexx-Interpreter enthält Beispiele, welche die OLE-Interaktion mit Access, Word, Excel, Active Directory, WMI und anderen Programmen verdeutlichen. Außerdem ist ein Hilfsprogramm für die Suche nach verfügbaren OLE-Objekten enthalten.[32]
exc = .OLEObject~new("Excel.Application") /* Objekt für Excel erstellen */
exc~visible = .true /* Excel sichtbar machen */
Worksheet = exc~Workbooks~Add~Worksheets[1] /* Arbeitsblatt hinzufügen */
Worksheet~cells(1,1)~Value = “Erste Zelle” /* Zeichenkette in Zelle einfügen */
Zusätzlich zur OLE-Unterstützung ermöglicht die Windows-Erweiterung die Interaktion mit dem Windows-Programm-Manager, dem System-Ereignisprotokoll, der Zwischenablage und der Registrierungsdatenbank sowie die Abfrage, Bearbeitung und Interaktion mit Fenstern, Menüs oder Untermenüs.[48]
Siehe auch
[Bearbeiten | Quelltext bearbeiten]Literatur
[Bearbeiten | Quelltext bearbeiten]- W. David Ashley, Rony G. Flatscher, Mark Hessling, Rick McGuire, Lee Peedin, Oliver Sims, Jon Wolfers: ooRexx Documentation 5.0.0 Open Object Rexx Reference. RexxLA, 2022 (sourceforge.net [PDF]).
- W. David Ashley, Rony G. Flatscher, Mark Hessling, Rick McGuire, Lee Peedin, Oliver Sims, Jon Wolfers: ooRexx Documentation 5.0.0 Programmer Guide. RexxLA, 2022 (sourceforge.net [PDF]).
- W. David Ashley, Rony G. Flatscher, Mark Hessling, Rick McGuire, Lee Peedin, Oliver Sims, Oliver Sims, Jon Wolfers: ooRexx Documentation 5.0.0 Windows Extensions Reference. RexxLA, 2022 (sourceforge.net [PDF]).
- W. David Ashley, Rony G. Flatscher, Mark Hessling, Rick McGuire, Lee Peedin, Oliver Sims, Jon Wolfers: ooRexx Documentation 5.0.0 Application Programming Interfaces. RexxLA, 2022 (sourceforge.net [PDF]).
- Howard Fosdick: Rexx Programmer's Reference. 2nd Auflage. Rexx Language Association, 2024, ISBN 978-94-037-4552-7 (rexxinfo.org [PDF]).
- Rony G. Flatscher: Introduction to Rexx and ooRexx: From Rexx to Open Object Rexx (ooRexx). Mijnbestseller, 2024, ISBN 978-94-037-5503-8.
Weblinks
[Bearbeiten | Quelltext bearbeiten]- Rony G. Flatscher: Menschenfreund – Automatisierungssprache Open Object Rexx 5.0 vor der Tür. In: iX. heise online, November 2017, abgerufen am 14. Dezember 2024.
- Rexx Language Association
- Open Object Rexx 5.0.0 Dokumentation
- Open Object Rexx auf Sourceforge
- Open Object Rexx Webseite
- Open Object Rexx auf Rosetta Code
- BSF4ooRexx auf Sourceforge
Einzelnachweise
[Bearbeiten | Quelltext bearbeiten]- ↑ a b c X3.274-1996 American National Standards Institute for Programming Language Rexx.
- ↑ a b c d Howard Fosdick: Rexx Programmer's Reference. 2nd Auflage. Rexx Language Association, 2024, ISBN 978-94-037-4552-7 (rexxinfo.org [PDF]).
- ↑ 7 Reasons that Rexx Still Matters. In: SmartBear.com. Abgerufen am 19. Juni 2024.
- ↑ a b IBM Object REXX - EDM2. In: www.edm2.com. Abgerufen am 19. Juni 2024.
- ↑ Simon C. Nash: Object Oriented REXX. In: Proceedings of the REXX Symposium for Developers and Users. 11. Juni 1990, S. 76–100 (stanford.edu [PDF]).
- ↑ Simon C. Nash: An Object Rexx Retrospective. In: Proceedings of the 20th Rexx Language Symposium. 21. Mai 2009 (rexxla.org [PDF]).
- ↑ a b IBM Object REXX for OS/2 - EDM2. In: www.edm2.com. Abgerufen am 19. Juni 2024.
- ↑ a b IBM Object REXX Now Runs on Windows NT and Windows 95. IBM, 25. Februar 1997 .
- ↑ Manfred Schweizer, Uwe Berger: From Object REXX to ooRexx. In: Proceedings of the 16th Rexx Language Symposium. 21. April 2005 (rexxla.org [PDF]).
- ↑ a b IBM Object REXX for AIX - Object-Oriented Scripting Language for Beginners to Advanced Programmers. IBM, 30. März 1999 .
- ↑ a b IBM Object REXX for Windows V2R1 - Object-Oriented Programming for Beginners to Advanced Users. IBM, 20. März 2001 .
- ↑ Willis Boughton: SOM and Object REXX. EDM/2, 2004, abgerufen am 2. Februar 2014.
- ↑ Object REXX Reference. IBM, Accessing Workplace Shell Objects.
- ↑ Does ArcaOS include REXX support? Abgerufen am 3. September 2020.
- ↑ Software withdrawal and service discontinuance: IBM Object REXX. IBM, 12. Oktober 2004 .
- ↑ RexxLA - Rexx Symposia. In: www.rexxla.org. Abgerufen am 17. Mai 2024.
- ↑ ooRexx (Open Object Rexx) - Browse /oorexx at SourceForge.net. In: sourceforge.net. Abgerufen am 18. Mai 2024.
- ↑ ooRexx (Open Object Rexx) - Browse /oorexx-docs at SourceForge.net. In: sourceforge.net. Abgerufen am 18. Mai 2024.
- ↑ Rony G. Flatscher: The IntelliJ IDEA Plugin ooRexxPlugin 2.2 for Rexx and ooRexx 5.0
- ↑ a b c d ooRexx News. In: Sourceforge. Abgerufen am 18. Mai 2024.
- ↑ Open Object Rexx Reference Version 3.0.0 Edition. RexxLA, 24. März 2005 (sourceforge.net [PDF; abgerufen am 18. Mai 2024]).
- ↑ ooRexx 4.0.0: Readme. Abgerufen am 18. Mai 2024
- ↑ ooRexx 4.1.0: ReleaseNotes. Abgerufen am 18. Mai 2024
- ↑ ooSQLite: Readme. Abgerufen am 18. Mai 2024
- ↑ ooRexx 4.2.0: Changes. Abgerufen am 18. Mai 2024
- ↑ ooRexx 5.0.0: Changes. Abgerufen am 18. Mai 2024
- ↑ a b c Mike Cowlishaw: The design of the REXX language. In: ACM SIGPLAN Notices. 22. Jahrgang, Nr. 2, 1987, S. 26–35, doi:10.1145/24686.24687 (acm.org [PDF]).
- ↑ 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 aa W. David Ashley, Rony G. Flatscher, Mark Hessling, Rick McGuire, Lee Peedin, Oliver Sims, Jon Wolfers: ooRexx Documentation 5.0.0 Open Object Rexx Reference. RexxLA, 2022 (sourceforge.net [PDF]).
- ↑ a b c d Rony G. Flatscher, Till Winkler: Employing the Message Paradigm to Ease Learning Object-oriented Concepts and Programming. In: In 2024 47th MIPRO ICT and Electronics Convention (MIPRO). S. 1244–1249 (wu.ac.at [PDF]).
- ↑ a b c Till Winkler, Rony G. Flatscher: Cognitive Load in Programming Education: Easing the Burden on Beginners with REXX. In: Central European Conference on Information and Intelligent Systems. (wu.ac.at [PDF]).
- ↑ Andreas Stefik, Susanna Siebert: An empirical investigation into programming language syntax. In: ACM Transactions on Computing Education. 13. Jahrgang, Nr. 4, 2013, S. 1–40, doi:10.1145/2534973 (acm.org).
- ↑ a b c d e f g h i j k W. David Ashley, Rony G. Flatscher, Mark Hessling, Rick McGuire, Lee Peedin, Oliver Sims, Jon Wolfers: ooRexx Documentation 5.0.0 Programmer Guide. RexxLA, 2022 (sourceforge.net [PDF]).
- ↑ a b Rony G. Flatscher, Till Winkler: Devising a TraceObject Class for Improved Runtime Monitoring of ooRexx Applications. In: Proceedings of the 7th ACM International Workshop on Verification and Monitoring at Runtime Execution. 2024, S. 19–24 (acm.org [PDF]).
- ↑ W. David Ashley, Rony G. Flatscher, Mark Hessling, Rick McGuire, Lee Peedin, Oliver Sims, Jon Wolfers: ooRexx Documentation 5.0.0 Rexx Extensions Library Reference. RexxLA, 2022 (sourceforge.net [PDF]).
- ↑ W. David Ashley, Rony G. Flatscher, Mark Hessling, Rick McGuire, Lee Peedin, Oliver Sims, Jon Wolfers: ooRexx Documentation 5.0.0 RxSock TCP/IP Socket Functions Reference. RexxLA, 2022 (sourceforge.net [PDF]).
- ↑ W. David Ashley, Rony G. Flatscher, Mark Hessling, Rick McGuire, Lee Peedin, Oliver Sims, Jon Wolfers: ooRexx Documentation 5.0.0 RxFtp Class Library Reference. RexxLA, 2022 (sourceforge.net [PDF]).
- ↑ W. David Ashley, Rony G. Flatscher, Mark Hessling, Rick McGuire, Lee Peedin, Oliver Sims, Jon Wolfers: ooRexx Documentation 5.0.0 RxMath Math Functions Reference. RexxLA, 2022 (sourceforge.net [PDF]).
- ↑ W. David Ashley, Rony G. Flatscher, Rick McGuire, Lee Peedin, Oliver Sims, Jon Wolfers: ooRexx Documentation 4.2.4 ooDialog Reference. RexxLA, 2019 (sourceforge.net [PDF]).
- ↑ W. David Ashley, Rony G. Flatscher, Mark Hessling, Rick McGuire, Lee Peedin, Oliver Sims, Erich Steinböck, Jon Wolfers: ooRexx Documentation 5.0.0 nCurses Class Library Reference. RexxLA, 2022 (sourceforge.net [PDF]).
- ↑ W. David Ashley, Rony G. Flatscher, Mark Hessling, Rick McGuire, Lee Peedin, Oliver Sims, Erich Steinböck, Jon Wolfers: ooRexx Documentation 5.0.0 Unix Extensions Function Reference. RexxLA, 2022 (sourceforge.net [PDF]).
- ↑ a b W. David Ashley, Rony G. Flatscher, Mark Hessling, Rick McGuire, Lee Peedin, Oliver Sims, Jon Wolfers: ooRexx Documentation 5.0.0 Application Programming Interfaces. RexxLA, 2022 (sourceforge.net [PDF]).
- ↑ W. David Ashley, Rony G. Flatscher, Rick McGuire, Mark Miesfeld, Lee Peedin, Oliver Sims, Jon Wolfers: ooRexx Documentation 1.0.0 ooSQLite Reference. RexxLA, 2022 (sourceforge.net [PDF]).
- ↑ a b BSF4ooRexx. In: sourceforge.net. Abgerufen am 10. November 2024.
- ↑ a b Rony G. Flatscher: The 2009 Edition of BSF4Rexx Part I In: 20th Rexx Language Symposium, RexxLA, 2009
- ↑ Christoph Waglechner: OpenOffice.org Automation Using ooRexx Scripting Language by means of Selected Nutshell Examples by Andrew Pitonyak. 2009 (wu.ac.at [PDF]).
- ↑ Adrian Baginski: A .NET Cookbook Using ooRexx.NET. 2016 (wu.ac.at [PDF]).
- ↑ Richard Lagler: D-Bus Language Binding for ooRexx: An Introduction on Nutshell Examples. 2015 (wu.ac.at [PDF]).
- ↑ a b W. David Ashley, Rony G. Flatscher, Mark Hessling, Rick McGuire, Lee Peedin, Oliver Sims, Oliver Sims, Jon Wolfers: ooRexx Documentation 5.0.0 Windows Extensions Reference. RexxLA, 2022 (sourceforge.net [PDF]).