II. A REXX alapelemei

A REXX programok - a más nyelveken írt programokhoz hasonlóan - néhány alap-építôelem folyamatos kombinálásából keletkeznek. Ebben a leckében áttekintjük a REXX alapelemeit, hogy egy átfogó képet kapjunk a nyelvrôl. Az áttekintés meglehetôsen "felületes" lesz, ezért aki esetleg nem értene meg valamit, az ne nyugtalankodjon, mivel a következô leckékben részeletekbe menôen "vesézzük majd ki" a témát. Leckénk során gyakran fogunk hivatkozni az alábbi példaprogramra, melynek sorait (a hivatkozások megkönnyítése érdekében) megszámoztuk. Ha valaki futtatni akarja (a REXX alapelemeinek tanulmányozására tökéletesen megfelelô, azonban igazi extra funkcionalitást nem kínáló programot), akkor a forráskódot természetesen a számozás elhagyásával kell begépelnie.

 1:	/* fájlkeresôprogram */
 2:	
 3:  	IF Arg() >< 0 THEN   /* Vannak paraméterek? */
 4:	  	PARSE ARG filename
 5:	ELSE
 6:		DO
 7:		SAY "Gépeld be a keresendô fájl nevét!"
 8:		PULL filename
 9:		END
10:
11:	CALL Vizsgal
12:
13:	'dir 'filename' /B /S'
14:
15:	EXIT
16:
17:	/* Biztosítjuk, hogy a keresés a fôkönyvtárban kezdôdôjön */
18:	Vizsgal: PROCEDURE EXPOSE filename
19:		IF LEFT(filename, 1) >< '\' THEN
20:			filename = '\' || filename
21:		RETURN

A példaprogram megkeresi az összes olyan fájlt, amelynek neve megegyezik a paraméterként megadott névvel. Amennyiben a programot paraméter nélkül indítjuk, akkor pedig bekéri a keresendô fájl nevét. Most pedig lássuk az alapelemeket.

Megjegyzések (1, 3 és 17 sorok a példaprogramban)

A REXX programokban, minden szöveg, amely a /* és */ jelek között szerepel, megjegyzésnek számít. Minden REXX programnak kötelezôen megjegyzéssel kell kezdôdnie, tehát a fájl elsô két karaktere /* kell, hogy legyen, amelyet egy magyarázó szöveg követ, amit aztán */ zár le. Az OS/2 egy .CMD fájlról mindig az elsô sor tartalma alapján dönti el, hogy azt REXX programként, vagy pedig kötegfájlként fogja értelmezi. A leggyakrabban elôforduló kezdô REXX programozói hiba az, hogy elfelejtkeznek az elsô sor kötött szerepérôl, s így az OS/2 kötegfájlként próbálja végrehajtani a REXX programot, melynek eredménye a következô, vagy ehhez hasonló hibaüzenetek tömkelege lesz:

SYS1041: The name * is not recognized as an
internal or external command, operable program or batch file.

Megjegyzéseinket elhelyezhetjük sorok részeként, önálló sorban, vagy akár több soron keresztül is. Az alábbi megjegyzések mindegyike helyes:

/* Ez a megjegyzés egy teljes sort elfoglal. */
SAY "Hi"	/* Ez a megjegyzés viszont csak a sor egy részét foglalja el. */

/* Ez a megjegyzés olyan
terjedelmes, hogy sorokon
keresztül tart. */

/* Ez a megjegyzés /* megjegyzést */ tartalmaz
ezt viszont nem ajánljuk, mivel nagyon áttekinthetetlenné
teszi /* a */ programot. */

A megjegyzések természetesen nincsenek kihatással a program mûködésére; szerepük általában csupán annyi, hogy magyarázzák a program mûködését és ezzel megkönnyítsék a program késôbbi értelmezését. Ne becsüljük alá a megjegyzések szerepét; elôbb utóbb mindenki kerülhet még olyan helyzetbe, hogy mások (esetleg a saját maga) által írt programot kell évekkel késôbb értelmeznie, s akkor bizony jól jön majd az extra információ.

Instrukciók/Utasítások (3..9, 11, 15 és 18..21 sorok a példaprogramban)

Az instrukciók a nyelv azon alapelemei, melyek utasítják a REXX-et, hogy tulajdonképpen mit is csináljon. Ezekbôl természetesen nagyon sok van, s most itt csak a példaprogramban szereplôkrôl lesz röviden szó.

IF...THEN...ELSE (3, 5, 19)
Ez az utasítás döntésre kényszeríti a programot az IF után megadott feltétel igaz, vagy hamis voltától függôen. Ha igaz a feltétel, akkor a THEN után található rész kerül végrehajtásra, míg ellenkezô esetben az ELSE rész lesz a "nyertes". Az ELSE ág nem kötelezô és sok esetben el is marad.

PARSE ARG (4)
A PARSE ARG begyûjti a program indításakor parancssorban megadott paramétert és (példánkban) a filename változóban tárolja el késôbbi felhasználás céljára. Ha már elejtettük a változó nevet, akkor annyit jegyezzünk is meg róluk, hogy a változók azok a programelemek, amelyekben adatot tárolhatunk.

DO...END (6, 9)
A DO...END szavak között felsorolt utasításokat egy egységnek tekinti a REXX. Ha tehát ez az egység éppen egy IF vagy ELSE után szerepel, akkor nem csak a tömb elsô, hanem az összes utasítása végre fog hajtódni. A DO...END utasítást használhatjuk még hurkok (többször egymás után végrehajtott programrészletek) létrehozására is, de errôl majd csak késôbb lesz szó, mivel példánkban nem található meg.

SAY (7)
Ezzel az utasítással információt jeleníthetünk meg a képernyôn. A paraméter lehet idézôjelek közé tett tetszôleges szöveg, vagy változó. Ha elhagyjuk az idézôjeleket, akkor a SAY utasítás automatikusan változónak tekinti a paramétert. Ha a változónak a meghívás pillanatában nem lenne még értéke, akkor a REXX a változó nevét nyomtatja ki, csupa nagybetûvel.

PULL (8)
A PULL-lal információt kérünk a felhasználótól. A példaprogramban a felhasználó által begépelt adat a filename változóban kerül eltárolásra. Amikor PULL-t használunk, a program végrehajtása egészen addig állni fog, amíg ENTERT-t nem érzékel.

CALL (11)
A CALL instrukcióval kérjük egy eljárás (külsô vagy belsô programrészlet) lefuttatását. A meghívott eljárás végrehajtása akkor fejezôdik be, amikor a REXX egy RETURN utasítást észlel, s ekkor a vezérlés visszatér a CALL után következô elsô sorhoz. A CALL utasítás tehát egy (általában gyakran használt) programrészletet helyettesít.

EXIT (15)
Az EXIT jelzi a program végét.

Eljárások (18...21 sorok a példában)

Az eljárások olyan programrészletek, melyek egy cimkével kezdôdnek és RETURN-nel végzôdnek. A címke nem más, mint egy szó, amely kettôspontra végzôdik. A szó egyben az eljárás neve is, tehát kívülrôl ezzel a szóval és a CALL utasítással hivatkozhatunk rá. Azokat az eljárásokat, amelyek a meghívás után értéket is visszaadnak, függvényeknek nevezzük. Amikor az eljárást lezáró RETURN után valamilyen érték áll, akkor ez azt jelenti, hogy függvénnyel van dolgunk, amely (nagy meglepetésünkre :) a RETURN után álló értéket adja vissza a meghívó programnak. A függvények meghívása is eltér a közönséges eljárásokétól, mivel függvények esetében a név után mindig zárójelek (és az esetleges paraméterek) következnek, valamint a CALL is elmarad. Az alábbiakban egy-egy példát láthatunk eljárás és függvény használatára:

/* eljárás */
SAY "A C: partición lévô szabad hely:"
CALL Szabadhely
...
...
EXIT

Szabadhely:
...
X = ...
...
SAY X'MB'
RETURN

/* függvény */
SAY "A C: partición "Szabadhely()"MB szabad hely van."

A példaprogramban az ARG (3. sor) és LEFT (19. sor) függvényekre láthatunk még példát.

Parancsok (a példaprogram 13. sora)

A parancsok tulajdonképpen az instruciók testvérei. Meghívásukkor szintén "végrehajtódik valami", azonban a parancs végrehajtását nem a REXX végzi, hanem a REXX-et futtató környezet, ami esetünkben az OS/2. Elvileg az összes OS/2-es parancs (copy, delete, backup stb.) használható REXX programban. Példánkban csak egyetlen parancs szerepel, a dir, amely itt a program kulcselemez, mivel ez keresi meg és listázza ki a kérdéses fájlokat. Elvileg nem szükséges, hogy a parancsokat idézôjelek közé tegyük (mint ahogy ez a példában látható), azonban ha így teszünk, akkor azzal egyrészt gyorsítjuk programunk értelmezését (a REXX egybôl tudni fogja, hogy parancsról van szó), másrészt elkerülhetünk olyan eseteket, amikor a REXX (helytelenül) instrukcióként próbálja meg végrehajtani a parancsot.

A program formája és a programozási stílus

A REXX programok formájára nincsen sok kötöttség, így szinte mindenki kedvére formázhatja a kódot. Igazából nem is lehet eldönteni, hogy melyik stílus a jobb és melyik a roszabb. Mindenki stilusában lehet találni jó és rossz elemeket egyaránt, ráadásul a helyes stílus a megvalósítandó feladattól is függhet. A legfontosabb az, hogy stílusunk konzisztens legyen, s ne fukarkodjunk a magyarázó megjegyzésekkel!


REXX GYÍK:

K1. A megjegyzések hogyan befolyásolják a program futtatási sebességét?
V1. Az elsô futtatáskor a REXX-nek meg kell vizsgálnia a megjegyzés sorokat is, így ez sebességcsökkenéssel jár. A lefordított program a kiterjesztett attribútumban kerül eltárolásra, ami a következô futtatáskor már rendelkezésre áll, így további sebességcsökkenés nem lép már fel.

K2. Mi történik, amikor egy REXX instrukciót írok a megjegyzésbe?
V2. A REXX ekkor figyelmen kívül hagyja az instrukciót. Ezt a módszert használjuk akkor, ha ideiglenes el akarjuk távolítani (törlés nélkül) a kód egy részét.

K3. Hol találom meg a REXX-ben definiált utasításokat?
V3. Az OS/2 információs gyûjtôjében található a REXX könyv, amelyben az összes utasítást megtaláljuk. (Parancssorból ugyanez: view rexx)


Gyakorlatok:

1. Írja meg a lehetô legrövidebb REXX programot!

2. A következô programban keresse meg a megjegyzéseket, instrukciókat és parancsokat!

/* Backup config.sys */
'copy config.sys \backup'
IF RC >< 0 THEN 
   SAY 'Hiba a másoláskor: 'RC
EXIT

Kádár Zsolt
1997. 09. 03.
[ Elôzô lecke | Következô lecke | Tartalom ]