Rexx
Rexx | |
Paradigma | procedurális, strukturált |
Jellemző kiterjesztés | .cmd, .bat, .exec, .rexx, .rex, EXEC |
Megjelent | 1979 |
Tervező | Mike Cowlishaw |
Fejlesztő |
|
Utolsó kiadás | ANSI X3.274 (stabil verzió, 1996) |
Típusosság | dinamikus |
Hatással volt rá | |
Weboldal |
A Rexx (Restructured Extended Executor) egy olyan programozási nyelv, amely értelmezhető vagy fordítható. Az IBM-nél fejlesztette ki Mike Cowlishaw . Ez egy strukturált, magas szintű programozási nyelv, amelyet úgy terveztek, hogy könnyen tanulható és olvasható legyen. Saját és nyílt forráskódú Rexx-értelmezők léteznek a számítási platformok széles skálájához; az IBM mainframe számítógépeihez léteznek fordítóprogramok.[1]
A Rexx egy teljes értékű nyelv, amely szkriptnyelvként, makrónyelvként és alkalmazásfejlesztési nyelvként is használható. Gyakran használják adatok és szövegek feldolgozására és jelentések készítésére; ez azt jelenti, hogy a Rexx jól működik a Common Gateway Interface (CGI) programozásban, és erre a célra használják, akárcsak a későbbi nyelveket, például a Perlt. A Rexx az elsődleges szkriptnyelv egyes operációs rendszerekben, pl. OS/2, MVS , VM , AmigaOS , és belső makrónyelvként is használatos néhány más szoftverben, például az SPF/PC-ben , a KEDIT-ben, a THE-ben és a ZOC terminálemulátorban . Ezenkívül a Rexx nyelv használható szkriptek és makrók készítésére bármely olyan programban, amely a Windows Scripting Host ActiveX szkriptmotorok nyelveit használja (pl. VBScript és JScript ), ha a Rexx motorok egyike telepítve van.
A Rexx a VM/SP Release 3-tól felfelé, a TSO/E 2. verziójától felfelé, az OS/2 (1.3 és újabb, ahol hivatalosan Procedures Language/2 a neve), az AmigaOS 2. verziójától felfelé, a PC DOS (7.0 vagy 2000), az ArcaOS[2], és a Windows NT 4.0 (Resource Kit: Regina). A CMS-hez készült REXX szkriptek osztoznak az EXEC és EXEC2 fájltípuson, és a szkript első sora megadja a használandó értelmezőt. Az MVS-hez készült REXX szkriptek felismerhetők[3] az EXEC alacsony szintű minősítő alapján, vagy felismerhetők[4] a kontextus és az első sor alapján. Az OS/2-re készült REXX szkriptek a .cmd fájlnévkiterjesztést használják más szkriptnyelvekkel együtt, és a szkript első sora megadja a használandó értelmezőt. A REXX-tudatos alkalmazások REXX-makrói az alkalmazás által meghatározott kiterjesztéseket használják. Az 1980-as évek végén a Rexx az IBM Systems Application Architecture általános szkriptnyelvévé vált, ahol átkeresztelték „SAA Procedure Language REXX”-re.
A nagyszámítógépes programozásban a Rexx szkriptet vagy parancsot néha EXEC-nek nevezik, az EXEC[5], EXEC 2[6] és a CP/CMS és a VM/370-től a z/VM-ig használt CMS fájltípusra utalva.
Jellemzők
[szerkesztés]- Egyszerű szintaxis
- A parancsok több környezetbe történő továbbításának lehetősége.
- Az a képesség, hogy egy adott hívó környezethez tartozó függvényeket, eljárásokat és parancsokat támogasson.
- Beépített verem, amely képes együttműködni a hoszt veremmel, ha van ilyen.
- Kis utasításkészlet, amely mindössze két tucat utasítást tartalmaz.
- szabad szintaxis
- Nagy- és kisbetűket nem érzékelő tokenek, beleértve a változók neveit is.
- Karakterlánc-alap
- Dinamikus adattípusozás , deklarációk nélkül
- Nincsenek fenntartott kulcsszavak , kivéve helyi kontextusban
- Nincsenek include fájl lehetőségek
- Tetszőleges numerikus pontosság
- Decimális aritmetika, lebegőpontos számítás
- Beépített függvények gazdag választéka, különösen a karakterlánc- és szövegfeldolgozásban.
- Automatikus tároláskezelés
- Crash-védelem
- Tartalomcímezhető adatszerkezetek
- Asszociatív tömbök
- Egyszerű hozzáférés a rendszerparancsokhoz és eszközökhöz
- Egyszerű hibakezelés, beépített nyomkövetés és hibakeresés
- Kevés mesterséges korlátozás
- Egyszerűsített I/O eszközök
- Nem szokványos operátorok
- Csak részben támogatja a Unix stílusú parancssori paramétereket, kivéve bizonyos implementációkat.
- Nem biztosít alapvető terminálvezérlést a nyelv részeként, kivéve bizonyos implementációkat.
- Nem biztosít általános módot a külső könyvtárakból származó függvények és alprogramok bevonására, kivéve a speciális megvalósításokat.
A Rexx mindössze huszonhárom, nagyrészt magától értetődő utasítással rendelkezik (például call
, parse
, és select
) minimális írásjel- és formázási követelményekkel. Lényegében egy szinte szabad formájú nyelv , egyetlen adattípussal, a karakterlánccal; ez a filozófia azt jelenti, hogy minden adat látható (szimbolikus), és a hibakeresés és a nyomon követés leegyszerűsödik.
A Rexx szintaxisa hasonló a PL/I-hez, de kevesebb jelöléssel rendelkezik; ez megnehezíti a (programonkénti) elemzést, de megkönnyíti a használatát, kivéve azokat az eseteket, ahol a PL/I szokásai meglepetésekhez vezethetnek. A REXX tervezési céljai között szerepelt a legkisebb meghökkentés elve.[7]
Története
[szerkesztés]1990 előtt
[szerkesztés]A Rexx-et először 1979. március 20. és 1982 közepe között Mike Cowlishaw , az IBM munkatársa tervezte és valósította meg assembly nyelven, mint „saját munkaidős” projektet, eredetileg egy szkriptprogramozási nyelvként, amely az EXEC és EXEC 2 nyelvek helyettesítésére készült.[8] Úgy tervezték, hogy makró vagy szkriptnyelv legyen bármilyen rendszerhez. Mint ilyen, a Rexx a Tcl és a Python előfutárának tekinthető. A Rexx-et a PL/I programozási nyelv egyszerűsített és könnyebben megtanulható változatának szánta a készítője. A PL/I-től való néhány eltérés azonban az óvatlanok számára buktatót jelenthet.
Először 1981-ben, a texasi Houstonban megrendezett SHARE 56 konferencián mutatták be nyilvánosan[9], ahol a Ted Johnston SLAC által támogatott vásárlói reakciók oda vezettek, hogy 1982-ben IBM termékként szállították.
Az évek során az IBM szinte minden operációs rendszerébe (VM/CMS , MVS TSO/E , IBM OS/400 , VSE/ESA , AIX, PC DOS , and OS/2), beépítette a Rexx-et, és elérhetővé tette a Novell NetWare, Windows, Java, és Linux számára is.
Az első nem IBM-es változatot Charles Daney írta PC DOS-ra 1984/5-ben[10] és a Mansfield Software Group (amelyet Kevin J. Kearney alapított 1986-ban) forgalmazta.[8] 1987-ben jelent meg az első fordítóváltozat, amelyet Lundin és Woodruff írt CMS-re.[11] Más változatok is készültek Atari, AmigaOS , Unix (számos változat), Solaris, DEC, Microsoft Windows, Windows CE, Pocket PC, DOS, Palm OS , QNX, OS/2, Linux, BeOS, EPOC32 /Symbian, AtheOS, OpenVMS,[12] Apple Macintosh, és Mac OS X.[13]
A Rexx Amiga változatát, az ARexx-et az AmigaOS 2-től kezdve tartalmazta AmigaOS , és népszerű volt a szkriptek írására, valamint az alkalmazások vezérlésére. Sok Amiga alkalmazásba beépítettek egy „ARexx portot”, amely lehetővé teszi az alkalmazás vezérlését a Rexx-ből. Egyetlen Rexx szkript akár különböző Rexx portok között is válthatott, hogy több futó alkalmazást is vezérelhessen.
1990-től napjainkig
[szerkesztés]1990-ben Cathie Dager, az SLAC munkatársa megszervezte az első független Rexx-szimpóziumot, amely a REXX Language Association megalakulásához vezetett. A szimpóziumokat évente tartják.
A Rexx több ingyenes verziója is elérhető. 1992-ben jelent meg a két legszélesebb körben használt nyílt forráskódú port: Ian Collier REXX/imc-je Unixra és Anders Christensen Regina[14] (később Mark Hessling által átvett) Windowsra és Unixra. A BREXX jól ismert a WinCE és a Pocket PC platformokon, és „visszaportálták” VM/370-re és MVS-re .
Az OS/2-nek van egy vizuális fejlesztőrendszere a Watcom VX-REXX . Egy másik dialektus a VisPro REXX volt a Hockware-től.
A Portable Rexx by Kilowatt és a Personal Rexx by Quercus két DOS-ra tervezett Rexx-értelmező, amelyek Windows alatt is futtathatók parancssor segítségével. Az 1990-es évek közepe óta a Rexx két újabb változata jelent meg:
- NetRexx : Java forráskódon keresztül Java bájtkódra fordítja; egyáltalán nem rendelkezik fenntartott kulcsszavakkal, és a Java objektum modellt használja, ezért általában nem felfelé kompatibilis a „klasszikus” Rexx-szel.
- Object REXX : a Rexx objektumorientált, általában felfelé kompatibilis változata.
1996-ban az American National Standards Institute (ANSI) szabványt adott ki a Rexx-re: ANSI X3.274–1996 "Information Technology – Programming Language REXX".[15] Több mint két tucat Rexx-ről szóló könyv jelent 1985 óta.
A Rexx 2004. március 20-án ünnepelte 25. évfordulóját, amelyet a REXX Language Association 15. Nemzetközi REXX Szimpóziumán ünnepeltek Böblingenben, Németországban, 2004 májusában.
2004. október 12-én az IBM bejelentette, hogy tervezi az Object REXX implementációjának forrásait a Common Public License alatt kiadni. Az Object REXX legújabb kiadásai tartalmaznak egy ActiveX Windows Scripting Host (WSH) szkriptelőmotort, amely a Rexx nyelv ezen változatát valósítja meg.
2005. február 22-én jelentették be az Open Object Rexx (ooRexx) első nyilvános kiadását. Ez a termék egy WSH scripting motort tartalmaz, amely lehetővé teszi a Windows operációs rendszer és az alkalmazások Rexx-szel történő programozását ugyanolyan módon, mint ahogyan a Visual Basic és a JScript az alapértelmezett WSH telepítés és a Perl, Tcl , Python harmadik féltől származó scripting motorok által megvalósított.
2017 januárjától a REXX a TIOBE-indexben[16] a 100 legjobb nyelv közé nem tartozó ötven nyelv között szerepelt.[17]
2019-ben a 30. Rexx Language Association Symposium a Rexx 40. évfordulóját ünnepelte. A szimpóziumot az angliai Hursleyben tartották, ahol a Rexx-et először tervezték és megvalósították.[18]
Változatok
[szerkesztés]- VM/SP R3,[19]
- TSO/E V2[20]
- SAAREXX
- ARexx[21]
- BREXX
- Regina[14]
- Personal REXX
- REXX/imc[22]
- Reginald
- roo!
- r4
- Rexx for Palm OS
- S/REXX
- uni-REXX
- NetRexx[23]
- ooREXX[24]
- KEXX[25]
Eszközök
[szerkesztés]A RexxUtil eszközkészlet egy olyan függvénycsomag, amely a legtöbb Rexx implementációhoz és a legtöbb host operációs rendszerhez elérhető.[26] [27][28] A RexxUtil egy fájl- és könyvtárfüggvényeket, ablakos I/O-t, valamint a rendszerszolgáltatások, például a WAIT és a POST elérésére szolgáló függvényeket tartalmazó csomag.
A Rexx/Tk, a Tcl/Tk-hoz hasonlóan a Rexx programokban használható grafikai eszközkészlet széles körben elérhető.[29]
Windowsra kifejlesztettek egy Rexx IDE-t, a RxxxEd-et.[12] A hálózati kommunikációra szolgáló RxSock-ot, valamint a Regina Rexx egyéb kiegészítőit és implementációit is kifejlesztették, és a Windows parancssorához egy Rexx-értelmezőt is mellékelnek a legtöbb Resource Kitben a Windows különböző verzióihoz, amely a DOS mellett mindegyik alatt működik.
Helyesírás és nagybetűs írásmód
[szerkesztés]Eredetileg a nyelv neve Rex (Reformed Executor) volt; az extra „X”-et azért tették hozzá, hogy elkerüljék az ütközést más termékek nevével. A REX eredetileg csupa nagybetű volt, mivel a nagyszámítógépes kód nagybetű-orientált volt. Az akkori stílus a csupa nagybetűs nevek voltak, részben azért, mert akkoriban még szinte minden kód csupa nagybetűs volt. A termék esetében REXX lett belőle, és Mike Cowlishaw könyvének mindkét kiadása csupa nagybetűs nevet használ. A REstructured eXtended eXecutor-ra való bővítést 1984-ben használták a rendszertermékhez.[7]
Szintaxis
[szerkesztés]Ciklus
[szerkesztés]A ciklusvezérlési struktúra a Rexx-ben egy DO
-val kezdődik és egy END
-del végződik, de többféle változata létezik. A NetRexx a DO
helyett a LOOP
kulcsszót használja a ciklusoknál, míg az ooRexx a LOOP
-ot és a DO
-t egyenértékűnek tekinti
Feltételes ciklusok
[szerkesztés]A Rexx támogatja a hagyományos strukturált programozási ciklusok sokaságát, miközben egy feltételt tesztel az utasítások listájának végrehajtása előtt (do while
) vagy után (do until
):
do while [feltétel]
[utasítások]
end
do until [feltétel]
[utasítások]
end
Ismétlődő hurkok
[szerkesztés]A legtöbb nyelvhez hasonlóan a Rexx is képes ciklusokat létrehozni egy indexváltozó inkrementálása közben, és egy határérték elérésekor megállni:
do index = start [to limit] [by increment] [for count]
[instructions]
end
A növekmény elhagyható, és alapértelmezett értéke 1. A határérték is elhagyható, ami a ciklus örökké tartó folytatását eredményezi.
A Rexx engedélyezi a megszámlált ciklusokat, ahol a ciklus elején kiszámít egy kifejezést, és a cikluson belüli utasításokat ennyiszer hajtja végre:
do kifejezés
[utasítások]
end
A Rexx akár a program befejezéséig is képes ismételni:
do forever
[utasítások]
end
A program a leave
utasítással kiléphet az aktuális ciklusból, ami a do forever
ciklusból való kilépés szokásos módja, vagy az iterate
utasítással rövidre zárhatja azt.
Kombinált ciklusok
[szerkesztés]A PL/I-hez hasonlóan a Rexx is lehetővé teszi a feltételes és ismétlődő elemek kombinálását ugyanabban a ciklusban:[30]
do index = start [to limit] [by increment] [for count] [while condition]
[instructions]
end
do expression [until condition]
[instructions]
end
Feltételek
[szerkesztés]Feltételek tesztelése IF
használatával:
if [condition] then
do
[instructions]
end
else
do
[instructions]
end
Az ELSE
záradék opcionális.
Egyetlen utasítás esetén a DO
és az END
is elhagyható:
if [condition] then
[instruction]
else
[instruction]
A behúzás nem kötelező, de segít az olvashatóság javításában.
Több feltétel tesztelése
[szerkesztés]A SELECT a Rexx CASE struktúrája , amely a PL/I SELECT utasítás SELECT; form{{efn|Rexx has no equivalent to the SELECT (expression); formájából[31] származik. Más dinamikus nyelvek CASE-konstrukcióinak egyes implementációihoz hasonlóan a Rexx WHEN záradékai teljes feltételeket határoznak meg, amelyeknek nem kell egymással kapcsolatban állniuk. Ebben a tekintetben inkább hasonlítanak az IF-THEN-ELSEIF-THEN-...-ELSE
kódok kaszkádolt halmazaira, mint a C vagy Java switch utasításokra.
select
when [condition] then
[instruction] or NOP
when [condition] then
do
[instructions] or NOP
end
otherwise
[instructions] or NOP
end
A NOP utasítás „nincs művelet”, és akkor használatos, ha a programozó nem kíván semmit sem csinálni egy olyan helyen, ahol egy vagy több utasításra lenne szükség.
Az OTHERWISE záradék opcionális. Ha elhagyjuk, és nem teljesül a WHEN feltétel, akkor a SYNTAX feltétel lép életbe.
Egyszerű változók
[szerkesztés]A változók a Rexx-ben típus nélküliek, és kezdetben a nevükként, nagybetűvel kerülnek kiértékelésre. Így egy változó típusa változhat a programban való használatától függően:
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 */
Összetett változók
[szerkesztés]Sok más programozási nyelvtől eltérően a klasszikus Rexx nem támogatja közvetlenül a numerikus indexszel címzett változók tömbjeit. Ehelyett összetett változókat biztosít.[32] Egy összetett változó egy törzsből (stem) és egy farokból (tail) áll. A .
(pont) a törzs és a farok összekapcsolására szolgál. Ha a használt farkak numerikusak, könnyen előállítható ugyanaz a hatás, mint egy tömb esetében.
do i = 1 to 10
stem.i = 10 - i
end
Ezután a következő változók léteznek a következő értékekkel: stem.1 = 9, stem.2 = 8, stem.3 = 7
...
A tömbökkel ellentétben a törzsváltozók indexének nem kell egész számmal rendelkeznie. Például a következő kód érvényes:
i = 'Monday'
stem.i = 2
A Rexx-ben lehetőség van egy törzs alapértelmezett értékének beállítására is.
stem. = 'Unknown'
stem.1 = 'USA'
stem.44 = 'UK'
stem.33 = 'France'
E hozzárendelések után a stem.3
kifejezés 'Unknown'
eredményt adna.
A teljes törzs a DROP utasítással is törölhető.
drop stem.
Ennek hatására a korábban beállított alapértelmezett értékek is törlődnek.
Megállapodás szerint (és nem a nyelv részeként) az összetett stem.0
-t gyakran arra használják, hogy nyomon kövessék, hány elem van egy törzsben, például egy eljárás, amely egy szót ad hozzá egy listához, így kódolható:
add_word: procedure expose dictionary.
parse arg w
n = dictionary.0 + 1
dictionary.n = w
dictionary.0 = n
return
Lehetséges az is, hogy egy összetett változónak több eleme is legyen. Például:
m = 'July'
d = 15
y = 2005
day.y.m.d = 'Friday'
Több numerikus farokelemet lehet használni, hogy egy többdimenziós tömb hatását keltse.
A Rexx összetett változókhoz hasonló funkciók számos más nyelvben is megtalálhatóak (beleértve az asszociatív tömböket az AWK-ban, a hash-eket a Perl-ben és a Hashtables-t a Java-ban). A legtöbb ilyen nyelv rendelkezik olyan utasítással, amellyel egy ilyen konstrukció összes kulcsán (vagy a Rexx kifejezéssel élve: farkain) végig lehet iterálni, de ez hiányzik a klasszikus Rexx-ből. Ehelyett szükség van a tail (farok) értékek segédlistáinak vezetésére. Például egy szavak számlálására szolgáló programban a következő eljárást használhatjuk egy szó minden egyes előfordulásának rögzítésére.
add_word: procedure expose count. word_list
parse arg w .
count.w = count.w + 1 /* feltételezzük, hogy a count. 0-ra van állítva */
if count.w = 1 then word_list = word_list w
return
majd később:
do i = 1 to words(word_list)
w = word(word_list,i)
say w count.w
end
Némi áttekinthetőség árán lehetséges ezeket a technikákat egyetlen törzsben kombinálni:
add_word: procedure expose dictionary.
parse arg w .
dictionary.w = dictionary.w + 1
if dictionary.w = 1 /* feltételezzük, hogy a dictionary. = 0 */
then do
n = dictionary.0+1
dictionary.n = w
dictionary.0 = n
end
return
és később:
do i = 1 to dictionary.0
w = dictionary.i
say i w dictionary.w
end
A Rexx itt nem nyújt biztonsági hálót, így ha az egyik szó véletlenül egy egész szám, amely kisebb, mint a dictionary.0
, akkor ez a technika rejtélyes módon kudarcot vall.
A Rexx legújabb implementációi, beleértve az IBM Object REXX-et és a nyílt forráskódú implementációkat, mint az ooRexx, tartalmaznak egy új nyelvi konstrukciót , amely egyszerűsíti az iterációt egy törzs értéke felett, vagy egy másik gyűjtő objektum, például egy tömb, táblázat vagy lista felett.
do i over stem.
say i '-->' stem.i
end
Összefoglalva, az összetett változók szinte bármilyen adatszerkezet létrehozására alkalmas mechanizmust biztosítanak a Rexx-ben. Ezek közé tartoznak a listák vagy egyszerű tömbök, n-dimenziós tömbök, ritka vagy sűrű tömbök, kiegyensúlyozott vagy kiegyensúlyozatlan fák, rekordok és még sok más.
Kulcsszó utasítások
[szerkesztés]PARSE
[szerkesztés]A PARSE
utasítás különösen erős; egyesít néhány hasznos karakterlánc-kezelő funkciót. Szintaxisa a következő:
parse [upper] origin [template]
ahol az origin a forrást adja meg:
arg
(argumentumok, a parancssor legfelső szintjén, a sor végén)linein
(szabványos bemenet, pl. billentyűzet)pull
(Rexx-adatsor vagy szabványos bemenet)source
(információ a program végrehajtásának módjáról)value
(egy kifejezés)with
: awith
kulcsszó szükséges a kifejezés végének megjelölésére.var
(változó)version
(verziószám/kiadási szám)
és template lehet:
- változók listája
- oszlopszám-határolók
- literális elválasztójelek
upper
opcionális; ha megadjuk, az adatokat nagybetűvé konvertáljuk az elemzés előtt.
Példák
[szerkesztés]Változólista használata sablonként
myVar = "John Smith"
parse var myVar firstName lastName
say "First name is:" firstName
say "Last name is:" lastName
a következőket jeleníti meg:
First name is: John
Last name is: Smith
Határoló használata sablonként:
myVar = "Smith, John"
parse var myVar LastName "," FirstName
say "First name is:" firstName
say "Last name is:" lastName
a következőket is megjeleníti:
First name is: John
Last name is: Smith
Oszlopszám-határolók használata:
myVar = "(202) 123-1234"
parse var MyVar 2 AreaCode 5 7 SubNumber
say "Area code is:" AreaCode
say "Subscriber number is:" SubNumber
a következőket jeleníti meg:
Area code is: 202
Subscriber number is: 123-1234
Egy sablon (template) változók, szó szerinti határolók és oszlopszámhatárolók kombinációját használhatja.
INTERPRET
[szerkesztés]Az INTERPRET utasítás kiértékeli az argumentumát, és annak értékét Rexx utasításként kezeli. Néha az INTERPRET a legegyértelműbb módja egy feladat elvégzésének, de gyakran akkor használják, amikor egyértelműbb kódot lehet használni, például a value()
használatával.
Az INTERPRET további felhasználási területei a Rexx (decimális) tetszőleges pontosságú[33] aritmetikája (beleértve a fuzzy összehasonlításokat), a PARSE utasítás használata programozási sablonokkal, törzstömbökkel és ritka tömbökkel.
/* demonstrate INTERPRET with square(4) => 16 */
X = 'square'
interpret 'say' X || '(4) ; exit'
SQUARE: return arg(1)**2
Ez a 16-os értéket jeleníti meg, és kilép. Mivel a Rexx-ben a változók tartalma karakterláncok, beleértve a racionális számokat exponensekkel és akár teljes programokat is, a Rexx felajánlja a karakterláncok kiértékelt kifejezésekként való értelmezését.
Ez a funkció használható függvények átadására függvényparaméterként, például SIN vagy COS átadása egy eljárásnak integrálok kiszámítására.
A Rexx csak olyan alapvető matematikai funkciókat kínál, mint az ABS, DIGITS, MAX, MIN, SIGN, RANDOM, valamint a hexa és bináris konverziók teljes készletét bitműveletekkel. Az olyan összetettebb függvényeket, mint a SIN, a semmiből implementálták, vagy harmadik féltől származó külső könyvtárakból szerezték be. Néhány külső könyvtár, jellemzően a hagyományos nyelveken megvalósítottak, nem támogatták a kiterjesztett pontosságot.
A későbbi (nem klasszikus) verziók támogatják a CALL variable
konstrukciókat. A beépített VALUE
függvénnyel együtt a CALL számos esetben használható az INTERPRET
helyett. Ez egy klasszikus program:
/* terminated by input "exit" or similar */
do forever ; interpret linein() ; end
Egy kissé kifinomultabb „Rexx kalkulátor”:
X = 'input BYE to quit'
do until X = 'BYE' ; interpret 'say' X ; pull X ; end
A PULL
a parse upper pull
rövidítése. Hasonlóképpen, az ARG
a parse upper arg
rövidítése.
Az INTERPRET utasítás erejét másképp is lehetett használni. A Valour szoftvercsomag a Rexx értelmező képességére támaszkodott egy OOP-környezet megvalósításában. Egy másik felhasználási módot a Westinghouse Time Machine nevű, még ki nem adott termékében találtak, amely képes volt egy végzetes hibát követően teljes mértékben helyreállni.
NUMERIC
[szerkesztés] say digits() fuzz() form() /* => 9 0 SCIENTIFIC */
say 999999999+1 /* => 1.000000000E+9 */
numeric digits 10 /* csak a rendelkezésre álló memória korlátozza */
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)*/
Calculates √2 | Calculates e | |
---|---|---|
code | numeric digits 50
n=2
r=1
do forever /* Newton-módszer */
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
|
output | sqrt 2 = 1.414213562373095048801688724209698078569671875377 | e = 2.7182818284590452353602874713526624977572470936998 |
SIGNAL
[szerkesztés]A SIGNAL utasítás a vezérlés áramlásában bekövetkező rendellenes változásokra szolgál (lásd a következő szakaszt). Azonban vissza lehet élni vele, és úgy lehet kezelni, mint a más nyelvekben található GOTO utasítást (bár ez nem teljesen egyenértékű vele, mert a ciklusokat és más konstrukciókat is megszakítja). Ez nehezen olvasható kódot eredményezhet.
Hibakezelés és kivételek
[szerkesztés]A Rexx-ben a SIGNAL utasítás segítségével lehetőség van hibák és egyéb kivételek elfogására és kezelésére. Hét rendszerállapot létezik: ERROR, FAILURE, HALT, NOVALUE, NOTREADY, LOSTDIGITS és SYNTAX. Mindegyik kezelése tetszés szerint ki- és bekapcsolható a forráskódban.
A következő program addig fut, amíg a felhasználó meg nem szakítja:
signal on halt;
do a = 1
say a
do 100000 /* késleltetés */
end
end
halt:
say "The program was stopped by the user"
exit
A signal on novalue
utasításra adott jel megállítja a nem definiált változók használatát, amelyek egyébként a saját (nagybetűs) nevüket kapnák értékként. A NOVALUE
feltétel állapotától függetlenül egy változó állapota mindig ellenőrizhető a beépített SYMBOL
függvénnyel, amely a VAR-t adja vissza a definiált változók esetében.
A VALUE
függvény használható a változók értékének lekérdezésére NOVALUE
feltétel kiváltása nélkül, de fő célja a környezeti változók olvasása és beállítása, hasonlóan a POSIX getenv
és putenv
függvényekhez.
Feltételek
[szerkesztés]ERROR
- Pozitív RC egy rendszerparancsból
FAILURE
- Negatív RC egy rendszerparancshoz (pl. a parancs nem létezik)
HALT
- Rendellenes befejezés
NOVALUE
- Egy nem beállított változóra hivatkozott
NOTREADY
- Bemeneti vagy kimeneti hiba (pl. olvasási kísérlet a fájl végén túl)
SYNTAX
- Érvénytelen programszintaxis vagy más hibaállapot
LOSTDIGITS
- Elvesznek a szignifikáns számjegyek (ANSI Rexx, a TRL második kiadásában nem szerepel).
Amikor egy állapotot a SIGNAL ON
kezel, a SIGL
és RC
rendszerváltozók elemezhetők a helyzet megértéséhez. Az RC tartalmazza a Rexx hibakódot, a SIGL pedig a hiba keletkezésének sorszámát.
A Rexx 4-es verziójától kezdve a feltételek neveket is kaphatnak, és van egy CALL ON
konstrukció is. Ez praktikus, ha külső függvények nem feltétlenül léteznek:
ChangeCodePage: procedure /* a SIGNAL beállítások védelme */
signal on syntax name ChangeCodePage.Trap
return SysQueryProcessCodePage()
ChangeCodePage.Trap: return 1004 /* windows-1252 on OS/2 */
Jegyzetek
[szerkesztés]- ↑ Catalog of All Documents (filter=rexx). IBM library server, 2005. [2013. február 15-i dátummal az eredetiből archiválva]. (Hozzáférés: 2014. február 10.)
- ↑ Does ArcaOS include REXX support?. (Hozzáférés: 2020. szeptember 3.)
- ↑ A TSO EXEC parancs minősítetlen adatkészletnévvel és sem a CLIST, sem az EXEC opcióval nem vizsgálja az alacsony szintű minősítőt vagy az EXEC-et.
- ↑ Ha a SYSPROC-ból lehívott szkript első sora egy REXX-et tartalmazó megjegyzés, akkor a rendszer REXX-ként kezeli, nem pedig CLIST-ként. A SYSEXEC-ből lehívott szkriptnek REXX-nek kell lennie.
- ↑ IBM Virtual Machine Facility /370: EXEC User's Guide, Second, International Business Machines Corporation. GC20-1812-1 (1975. április 1.)
- ↑ EXEC 2 Reference, Second, International Business Machines Corporation, 92. o.. SC24-5219-1 (1982. április 1.)
- ↑ a b M. F. Cowlishaw (1984). „The design of the REXX language”. IBM Systems Journal 23 (4), 333. o, Kiadó: IBM Research. DOI:10.1147/sj.234.0326. (Hozzáférés: 2014. január 23.) „Lehet, hogy az új funkcióhoz magas meghökkenési faktor társul? Ha egy funkciót a felhasználó véletlenül rosszul alkalmaz, és a felhasználó számára kiszámíthatatlannak tűnő eredményt okoz, akkor az adott funkciónak magas a meghökkenési faktor, és ezért nem kívánatos. Ha egy szükséges funkciónak magas a meghökkenési faktor, akkor szükség lehet a funkció újratervezésére.”
- ↑ a b M. F. Cowlishaw: IBM REXX Brief History. IBM. (Hozzáférés: 2006. augusztus 15.)
- ↑ M. F. Cowlishaw: REX -- A Command Programming Language. SHARE, 1981. február 18. (Hozzáférés: 2006. augusztus 15.)
- ↑ Melinda Varian: REXX Symposium, May 1995
- ↑ Lundin, Leigh (1987. április 23.). „T/REXX, a REXX compiler for CMS”. U.S. Copyright Office, Washington, DC (TXu000295377), Kiadó: Independent Intelligence Incorporated. (Hozzáférés: 2010. február 20.)
- ↑ a b Howard Fosdick. Rexx Programmer's Reference. Wiley Publishing, 390. o. (2005). ISBN 0-7645-7996-7
- ↑ Rexx Implementations. RexxLA. [2006. szeptember 24-i dátummal az eredetiből archiválva]. (Hozzáférés: 2006. augusztus 15.)
- ↑ a b Mark Hessling: Regina Rexx Interpreter. SourceForge project regina-rexx, 2012. október 25. (Hozzáférés: 2014. február 10.)
- ↑ While ANSI INCITS 274-1996/AMD1-2000 (R2001) and ANSI INCITS 274-1996 (R2007) are chargeable, a free draft can be downloaded: American National Standard for Information Systems – Programming Language REXX
- ↑ A TIOBE programozói közösségi index a programozási nyelvek népszerűségének mérőszáma.
- ↑ The Next 50 Programming Languages. TIOBE index. tiobe.com, 2017. [2017. január 19-i dátummal az eredetiből archiválva]. (Hozzáférés: 2017. január 10.)
- ↑ RexxLA - Symposium Schedule
- ↑ IBM: REXX/VM Reference. MANMRK, 1999 (Hozzáférés: 2023. május 29.)
- ↑ TSO/E REXX Reference
- ↑ ARexx Programming
- ↑ REXX/imc reference
- ↑ NetRexx
- ↑ Open Object Rexx
- ↑ KEXX Summary
- ↑ Chapter 8. Rexx Utilities (RexxUtil). Open Object Rexx . (Hozzáférés: 2023. október 13.)
- ↑ REXX Tips & Tricks:REXXUTIL functions. EDM2: The Electronic Developer Magazine for OS/2 . (Hozzáférés: 2023. október 14.)
- ↑ Regina Rexx Interpreter. Sourceforge . (Hozzáférés: 2023. október 14.)
- ↑ Rexx/Tk
- ↑ M. F. Cowlishaw. The Rexx Language - A Practical Approach to Programming, 2nd, Prentice Hall (1990). ISBN 0-13-780651-5
- ↑ A Rexx nem rendelkezik a SELECT (kifejezés); formájának megfelelőjével.
- ↑ How to Code Arrays and Other Data Structures In Rexx
- ↑ A Rexx a számokat szövegként tárolja, ezért a pontosság csak a string hosszától függ.
További információk
[szerkesztés]Fordítás
[szerkesztés]- Ez a szócikk részben vagy egészben a Rexx című angol Wikipédia-szócikk fordításán alapul. Az eredeti cikk szerkesztőit annak laptörténete sorolja fel. Ez a jelzés csupán a megfogalmazás eredetét és a szerzői jogokat jelzi, nem szolgál a cikkben szereplő információk forrásmegjelöléseként.