@SA1 @ZS2  Der ARexx-Kurs für Einsteiger Teil 1 @ZS0  Von Carsten Drücke  ARexx ist eine Programmiersprache und ist BASIC sehr ähnlich. Beides sind Interpreter-Sprachen; Programme werden also während ihres Ablaufs übersetzt. Daher kann man natürlich in Punkto Geschwindigkeit keine Wunder erwarten. Der Vorteil bei der Interpretierung ist die Möglichkeit, Programme Schritt für Schritt auszutesten, was die Entwicklung eines Programmes sehr vereinfacht. ARexx ist die Portierung der Sprache REXX, die auf den DOSen entwickelt wurde. Das wiederum bedeutet, daß ARexx keinerlei Unterstützung für Sound oder Grafik bietet. Ausgaben eines ARexx-Programmes werden also nur auf einer Shell ange- zeigt. Was es trotzdem interessant macht, sich mit ARexx zu befassen, ist die Mög- lichkeit, mit ARexx-Programmen andere Programme zu steuern. Dadurch können bestimmte Abläufe automatisiert und/oder vereinfacht werden. Weiterhin kann man auch kleinere Programme in ARexx programmieren, für die der Aufwand zu groß wäre, um sie in einer anderen Programmiersprache zu erstellen. Last but not least, ARexx ist weitgehend portabel und auf verschiedenen Sys- temen zu finden, wie z.B. I*M OS/2 oder UNOX.  Übersicht: 1. Getting started, ARexx installieren 2. Konventionen, Namensgebung und Verzeichnisse 3. ein erstes Programm 4. Variablen und Datentypen 5. Operatoren @NS  1. Getting started ... ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ Um die ersten Schritte mit ARexx machen zu können, müssen zunächst bestimmte Voraussetzungen geschaffen werden. ARexx gehört zum Lieferumfang der Workbench 2.0 und höher. Trotzdem kann ARexx auch unter Kickstart 1.2/1.3 benutzt werden. Wer eine Original-2.0(++)-Workbench benutzt, braucht sich um nichts Gedanken zu machen, da ARexx dort schon fertig installiert ist. Ob das der Fall ist, kann man folgendermaßen herausfinden: Zuerst muß man eine Shell/CLI öffnen. Hinter dem Prompt wird dann eingegeben:  rx "say('Hello')" Nachdem man RETURN betätigt hat, sollte der Text "Hello" ausgegeben werden. Ist das nicht der Fall, und statt einer Begrüßung erscheint eine Fehler- meldung, so muß man folgendes kontrollieren: - Auf der Workbench sollte ein Verzeichnis "rexxc" vorhanden sein. - In diesem Verzeichnis müssen sich folgende Dateien befinden:  rexxc/hi rexxc/rx rexxc/rxc rexxc/rxlib rexxc/rxset rexxc/tcc rexxc/tco rexxc/te rexxc/ts rexxc/WaitForPort  - Weiterhin muß im Verzeichnis SYS:System die Datei RexxMast vorhanden sein. RexxMast ist ein residentes Programm, welches den eigentlichen Interpreter darstellt. - Im Verzeichnis LIBS: müssen die Dateien "rexxsyslib.library" "rexxsupport.library" "mathieeedoubbas.library" zu finden sein. - Folgende Befehle müssen jetzt noch in die StartUp-Sequence eingefügt werden, falls sie nicht schon dort sind.  assign REXX: S: *1 path SYS:rexxc add *2 SYS:System/RexxMast >NIL: *3  Die Sternchen (*) mit den Nummern dürfen natürlich nicht mit eingegeben werden, sie dienen nur der Erklärung, die jetzt folgt. *1 In dem logischen Laufwerk REXX: sucht der Interpreter zuerst ein ARexx- Programm, sofern der Programmname nicht mit einem Pfad angegeben wurde. Hier wird das Verzeichnis S: benutzt, es kann aber auch jedes beliebige andere Verzeichnis sein, in welchem man seine ARexx-Programme ablegen möchte. *2 Mit dieser Anweisung wird ein zusätzlicher Pfad eingerichtet, auf dem der Shellprozess nach Programmen sucht. *3 Damit wird der Rexx-Interpreter gestartet. Zum Erstellen von ARexx-Programmen benötigt man dann noch einen Editor, mit dem man Texte im ASCII-Format abspeichern kann.  2. Konventionen ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ Wie immer gibt es auch bei ARexx ein paar Vereinbarungen, die im wesentlichen der Übersicht dienen, und Mißerfolgen vorbeugen. Benennung von ARexx-Programmen: Der Name, unter dem ein ARexx-Programm abgelegt wird, kann relativ frei gewählt werden. Man sollte den Name aber so wählen, daß man auch später noch weiß, wozu das Programm eigentlich da ist. Weiterhin sollten ARexx-Proggies, die auf der Shell gestartet werden mit ".rexx" enden. Andere Programme die mit einem ARexx-Port ausgestattet sind, erwarten andere Endungen. Dieses steht dann aber in der Regel in den Handbüchern zu dem Programm. Abspeichern von ARexx-Programmen: Normalerweise sollte man ARexx-Programme im Verzeichnis  rexx: ablegen. Hier werden sie zuerst vom Interpreter gesucht. Man kann natürlich auch ein be- liebiges anderes Verzeichnis wählen, muß dann aber beim Aufruf des Programms den vollständigen Pfad angeben.  3. Das erste Programm ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ Wie bei allen Programmiersprachen, versuchen wir zunächsteinmal das berühmte "Hello World" auszugeben. Die angegebenen Zeilennummern gehören wie immer nicht dazu !  1: /* Das Hello-World Programm */ 2: say 'Hello World'  1: Alle ARexx-Programme beginnen mit einer Kommentarzeile. Der ARexx-Inter- preter verweigert die Abarbeitung eines Textes, der nicht damit beginnt. Ein Kommentar wir durch /* und */ begrenzt und kann auch über mehrere Zeilen ge- hen. 2: Die ARexx-Funktion "say" gibt einen Text aus. Der Text ist in diesem Fall durch einfache Anführungszeichen eingeschlossen. Die Benutzung von doppelten Anführungszeichen wäre aber ebenso richtig gewesen, so daß folgende Angaben identisch sind: 'Hello World' "Hello World" Weiterhin hätte man noch Klammern um den Text legen können:  say('Hello World'). Die Klammern gehören nicht zum Text, sondern umschließen die Argumente der Funktion say. Nachdem das Programm abgetippt ist, muß es gespeichert werden. Es sollte im Verzeichnis REXX: abgelegt werden, da es dort vom Interpreter gefunden werden kann. Als Namen nehmen wir Hello.rexx. Die Endung ".rexx" zeigt an, daß es sich um ein ARexx-Programm handelt. Um das Programm zu starten, wird auf der Shell "rx Hello" eingegeben. Die Endung ".rexx" wird automatisch ergänzt. "rx" ist ein Programm im Verzeichnis rexxc. Es übergibt den Programmtext an den Interpreter.  4. Variablen und Datentypen. ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ Wie alle Programmiersprachen besitzt auch ARexx Variablen und ist dabei sogar sehr flexibel. Eine Variable kann mit einem beliebigen Namen bezeichnet werden, der aus alphanumerischen Zeichen besteht, fast beliebige Länge haben kann und sogar gleichlautend mit einer Funktion sein kann. Folgende Zuweisung wäre also richtig: say = 8 say(say) Allerdings sollte man auf solche Stunts verzichten und Variablen nach ihrer Funktion bezeichnen. ARexx-Variablen haben keinen expliziten Datentyp. Es ist also nicht erforder- lich eine Variable als String-, Integer-, oder Gleitpunktvariable zu definie- ren. Daher werden Variablen in ARexx als Symbole bezeichnet. Es wird unterschieden in: - feste Symbole, die mit einer Ziffer oder einem Dezimalpunkt beginnen - einfache Symbole, die weder Ziffern noch Punkte enthalten - Stamm-Symbole, die mit genau einem Punkt enden - Zusammengesetzte Symbole, die mehrere Punkte beinhalten Stamm- und Zusammengesetzte Symbole sind mit Feldern (Arrays) vergleichbar. /* Beispiele */ pi = 3.141 /* Zuweisung eines Gleitpunktwertes an ein einfaches Symbol */ a. /* ein Stammsymbol */ a.9 /* ein zusammengesetztes Symbol */ Mit der Zuweisung eines Wertes an das Symbol a.9 werden alle anderen Symbole (a.0, a.1, a.2, a.3, a.4, a.5, a.6, a.7, a.8) mit dem Wert 0 bzw. Leer initial- isiert. Zusammengesetzte Symbole eines Stammsymbols, also alle Variablen, die mit a. beginnen und auf eine Zahl enden, können unterschiedliche Datentypen bein- halten. Folgendes ist gültig: a.0 = 1.22 a.1 = 'Hallo' /* Beispiele für Zeichenketten (Strings) */  "Hello World" /* einfach, gel ? */ "" /* leere Zeichenkette */ 'what''s wrong' /* ergibt what's wrong */  Durch die Verdoppelung des Anführungszeichens innerhalb der Zeichenkette, wird es zu ihrem Bestandteil.  '30 31 32'x /* "012" hexadezimal dargestellt */  Das direkt hinter dem Hochkomma folgende X macht die Zeichenkette zu einer Hexadezimalzahl. Allerdings dürfen dann in der Zeichenkette auch nur die Zeichen 0-9 und a-f (A-F) enthalten sein.  '00100111'b /* eine binäre Zeichenkette */  Das B am Ende der Zeichenkette macht sie zu einer Binärzahl. Es sind nur 0 und 1 erlaubt.  Fallen und Pfähla ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ say("Hello"+3) In dieser Anweisung wird versucht, ein String zu einer Zahl zu addieren. Trotz aller Flexibilität geht das nicht. @NS  /* ein Testprogramm */ say(pi)  Wenn man diesen Zweizeiler startet, bekommt man "PI" als Ausgabe, da dem Symbol pi zuvor kein Wert zugewiesen wurde. Zeichenfolgen, die nicht in Hoch- kommas oder Anführungszeichen stehen, werden automatisch in Großbuchstaben gewandelt.  /* so gehts nicht */ a = 1 b = 2 text.3 = 'Hallo' say(text.a+b)  Die Bindung des Punktes zwischen text und a ist stärker, als die Bindung des Plus. Daher wird nicht, wie man das vielleicht möchte, zuerst der Wert von a+b ausgerechnet, sondern es wird versucht, text.1 + 2 zu berechnen. Es gibt auch nicht die Möglichkeit, den Term a+b zu klammern, so daß das gewünschte Ergeb- nis nur so erreichbar ist: @NS  /* so gehts dann */ a = 1 b = 2 text.3 = 'Hallo' c = a + b say(text.c)  @NS 5. Operatoren ¯¯¯¯¯¯¯¯¯¯¯¯¯  Sequenz Priorität Funktion Beispiel ~ 8 Logisches Nicht + 8 als Vorzeichen +1.42 - 8 als Vorzeichen -9 ** 7 Potenzierung 2**2 = 4 * 6 Multiplikation / 6 Division % 6 Ganzzahl-Division 7%2 = 3 // 6 Rest 7//2 = 1 + 5 Addition - 5 Subtraktion || 4 Verknüpfung 'Tach' || 'Auch' -> 'TachAuch' (Leer) 4 Verknüpfung 'Tach' 'Auch' -> 'Tach Auch' == 3 Exakte Gleichheit ~== 3 Exakte Ungleichheit = 3 Gleichheit ~= 3 Ungleichheit > 3 größer als < 3 kleiner als >= o. ~< 3 größer oder gleich <= o. ~> 3 kleiner oder gleich & 2 logisches UND | 1 logisches ODER ^ o. && 1 logisches EXCLUSIV ODER Die Operatoren werden entsprechen ihrer Priorität ausgewertet. So, als absolut notwendige Grundlage sollte das für's Erste reichen, weil a.) die Disk voll ist und b.) es spät ist. In der nächsten Ausgabe kommen dann ein paar mehr Funktionen und Anweisungen dran. Solange müßt ihr euch leider mit SAY begnügen, Sorry !