REXX è un linguaggio di scripting sviluppato in IBM ad opera di Mike
Cowlishaw. REXX sostituì i linguaggi
EXEC e EXEC 2 dell’ambiente time sharing CMS e fu reso disponibile
all’inizio del 1979 con nome originale REX (Restructured Extended eXecutor).
Rexx fu implementato sui principali sistemi IBM, e divenne il perno
dell’architettura SAA. Nel 1966 divenne uno standard ANSI (X3.274-1996). Sono
disponibili vari interpreti e compilatori, con più o meno estensioni, fra gli
altri Regina, NetRexx produce codice Java e ObjectRexx una
variante Object Oriented.
REXX è un linguaggio facile da utilizzare, indirizzato ad operare su testi e ad interagire col Sistema Operativo, infatti, tutto quanto non è interpretato, è passato all’elaborazione del Sistema Operativo.
La determinazione del tipo dei dati è guidata dal contesto
in cui sono utilizzati, e molte sono le funzioni su di essi, in particolare per
i dati testuali; tuttavia le capacità di parsificazione sono rudimentali
rispetto a quelle dei più recenti interpreti di espressioni regolari. Sono
gestiti numeri di dimensione arbitraria tramite la clausola: numeric digits n. L’ambito delle variabili è globale, tranne
per quelle utilizzate nelle funzioni in cui è presente il comando PROCEDURE. Alcuni nomi di comando e funzione sono
fuorvianti, ad esempio SIGNAL, utilizzato per trasferire il controllo ad
un altro punto del programma e per intercettare errori, altri del tutto o
parzialmente ridondanti (CENTRE e CENTER,
UPPER e TRANSLATE).
L’istruzione PARSE tipo è un’istruzione polimorfa, in funzione di tipo può estrarre i valori passati ad una funzione(ARG), informazioni sull’ambiente (VERSION e SOURCE), dallo stack (PULL), dallo standard input (LINEIN e PULL se lo stack è vuoto) ed infine da un’espressione. Il programma qui riportato è un limitato interprete di REXX, tramite l’istruzione INTERPRET e la cattura di alcuni errori.
SAY
PARSE VERSION ver; PARSE SOURCE opsys x script
PARSE VALUE opsys ver WITH versione
SAY versione '-' script
SIGNAL ON SYNTAX NAME errore
cicla: CALL CHAROUT, ': ' /* output senza ritorno a
capo */
PARSE PULL comando
IF ABBREV(TRANSLATE(comando),'FIN') == 1 THEN DO
SAY
CENTRE('Au revoir',13)
EXIT
END
INTERPRET
comando
SIGNAL
cicla
errore:
SAY 'Errore!' ERRORTEXT(rc)
SIGNAL cicla
L’esecuzione
dello script produce:
C:\CONDOR\Regina>rexx parse
11 13
WIN32 REXX-Regina_3.0 4.95 25
Apr 2002 - C:\CONDOR\Regina\parse.rexx
: parse arg a1 a2; say
'Argomenti:' a2 a1
Argomenti: 13 11
: say a1**a2
3.45227122E+13
: NUMERIC DIGITS 20
: say a1**a2
34522712143931
: fin
Au revoir
REXX ha un solo tipo di struttura dati complessa (compound symbol), ma sufficientemente flessibile da poter essere usata per matrici e matrici associative. I compound symbols sono individuati da un nome formato da due parti: stem, una variabile seguita da un punto, e tail, una o più stringhe, separate da un punto. Di fatto lo stem è il nome della matrice associativa, tail è una chiave, ed il valore è ovviamente il valore associato.
C:\CONDOR\Regina>rexx parse
WIN32 REXX-Regina_3.0 4.95 25 Apr 2002 - C:\CONDOR\Regina\parse.rexx
: diz. = 'nil' /* valore di default degli elementi */
: say diz.var
nil
: var = 'xilos' /* chiave xilos */
: diz.var = 'carpine'
: say var '=' diz.var
xilos = carpine
: var2 = 'xilos'
: diz.var2 = 'faggio'
: say var '=' diz.var
xilos = faggio
Se tail è numerico si hanno matrici, eventualmente multidimensionali.
Qui di seguito un altro esempio.
/*
REXX-Regina_3.0 4.95 25 Apr 2002 */
/*
il programma legge un documento e lo
trasforma in formato HTML
le righe indice sono formate dai titoli dei
pragrafi (es. 8.5 Rule Call)
e diventano link ai paragrafi relativi
*/
flname
= 'langdesc.txt'
'if
exist' langdesc.htm 'del' langdesc.htm /* elimina file */
flhtml
= 'langdesc.htm'
lab.
= 'nil' /* matrice associativa dei paragrafi */
call TestaHTML
do while lines(flname) > 0
line =
linein(flname)
parse value
line with parag titolo
if
DATATYPE(parag) = 'NUM' then do
link = parag * 10
if lab.link == 'nil' then do /* I volta,
la variabile non esiste */
lab.link = CHANGESTR(' ',titolo,'') /*
elimino spazi */
line = parag||'<A
href=#'||lab.link||'>'||titolo||'</A>'
end
else do
line =
'<H3>'||parag||' <A name='||lab.link||'>'||titolo||'</H3>'
end
end
call lineout
flhtml,line
end
call CodaHTML
exit
/*call lineout 'yourfile.txt', 'Data to be written'*/
TestaHTML:
call lineout
flhtml,'<HTML>'
call lineout
flhtml,'<HEAD> <TITLE> Documentazione di RIGAL </TITLE>
</HEAD>'
call lineout
flhtml,'<BODY><PRE>'
return
CodaHTML:
call lineout
flhtml,'</PRE></BODY>'
call lineout
flhtml,'</HTML>'
return