REXX

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