Corso di programmazione in REXX - Lezione 1 - nozioni di base


Riprendiamo con questo numero il corso sul linguaggio REXX che avevamo iniziato lo scorso anno nel primo numero di "Just WARP!".
Ripartiremo dalle basi del linguaggio, cercando di rendere i vari concetti il piu' possibile semplici in modo da risultare comprensibili anche a chi non ha alcuna esperienza di programmazione, con l'intento di trattare, in seguito, dopo il Classic REXX, anche il NET REXX e l'Object REXX. Per alcuni cenni sulla storia del REXX rimandiamo al summenzionato articolo.

Caratteristiche principali del REXX

Il REXX, Restructured eXtended eXecutor language è un semplice e versatile linguaggio di programmazione procedurale parte integrante dell'OS/2: La sua semplicità lo rende ottimo come primo linguaggio per i principianti. Comunque anche ai programmatori più esperti, il REXX fornisce, tramite potenti funzioni ed estese capacità matematiche, la possibilità di creare rapidamente applicazioni per svolgere anche funzioni relativamente complesse.

La principali istruzioni del REXX sono costituite da parole inglesi facenti parte del linguaaggio corrente e di significato intuitivo come: SAY, PULL, IF...THEN, DO...END, ecc.

Il formato del linguaggio è inoltre libero ed è possibile scrivere un'istruzione su più linee come anche scrivere più istruzioni in una sola linea.

Nonostante il REXX sia un linguaggio interpretato, al momento della prima esecuzione dello script esso viene precompilato negli attributi estesi del file stesso per cui le esecuzioni successive sono più veloci.

Oltre alle numerosi funzioni presenti nel REXX, OS/2 fornisce una libreria di funzioni aggiuntive che aggiungono ulteriori funzionalità come una facile interazione con gli oggetti della WPS. Altre librerie aggiuntive, spesso distribuite con la formula dello shareware o del tutto gratuitamente permettono di estendere le funzioni del REXX per compiti particolari.

Il nostro primo programma

Un programma in REXX è costituito da un semplice file di testo con una lista di istruzioni. Con il semplice esempio che segue, CIAO.CMD, il computer vi chiederà il vostro nome e poi vi rivolgerà un saluto.

/* CIAO.CMD : questo è il mio primo programma REXX */
say "Ciao! Come ti chiami?"
pull nome
if nome = "" then say "Ciao sconosciuto!"
else say "Ciao" nome
Copiamo in un file queste sette righe e salviamolo come CIAO.CMD. Dopo aver avviato una sessione comandi OS/2 ed esserci portati nella directory in cui abbiamo appena salvato lo script, digitiamo: CIAO. Sullo schermo verrà mostrato:
Ciao! Come ti chiami?
A questo punto se scrivete un mome (per esempio Alessandro) e premete Invio, il computer risponderà:
Ciao ALESSANDRO
Se invece avrete premuto Invio senza scrivere alcun nome il computer vi saluterà con:
Ciao sconosciuto!
Diamo uno sguardo ora in dettaglio alle varie istruzioni che compongono il programma.

I commenti

I commenti sono brevi annotazioni che non influiscono sull'esecuzione del programma, ma facilitano al programmatore la revisione di un listato permettendone così una più agevole estensione futura o rendendo più facile isolare parti di codice da riutilizzare in nuovi programmi.
E' essenziale perché uno script con estensione CMD venga riconosciuto dal sistema come un programma REXX, che il file (la prima colonna della prima riga) inizi con un commento.
Un file CMD, che non contenga all'inizio un commento riconosciuto dal REXX, viene infatti ritenuto da OS/2 come una semplice sequenza di comandi, esattamente come i file con estensione BAT del DOS.

I commenti in REXX sono introdotti dalla coppia di caratteri /* e chiusi dai caratteri */.
La riga /* CIAO.CMD : questo è il mio primo programma REXX */ nell'esempio precedente è quindi un commento e, iniziando all'inizio del file fa sì che OS/2 riconosca CIAO.CMD come un programma REXX.

I commenti non devono per forza iniziare e terminare nella medesima riga, ma possono anche essere scritti su più righe:

/* Questo è un esempio di
   un commento considerato
   valido dall'interprete REXX */
Una pratica comune è quella di racchiudere commenti che descrivono particolari blocchi di codice, come, per esempio, la descrizione dei compiti svolti da una funzione, dei parametri che essa accetta e del valore restituito, usando particolari caratteri che evidenzino il commento stesso. Non esistono regole! Potete usare i caratteri che preferite di più; l'importante e che tutto il blocco venga racchiuso tra /* e */!
/***********************************\
* Un commento presentato così       *
* viene individuato più facilmente  *
* all'interno di un lungo listato   *
\***********************************/

Parole chiave ed espressioni

Parole come SAY, PULL, IF, ecc. costituiscono le parole chiave del linguaggio: le istruzioni riconosciute dal programma di interpretazione del linguaggio, (cui ci riferiremo in seguito come interprete del linguaggio o semplicemente interprete).
E' da notare che di solito sono costituite da verbi. Esse rappresentano dei comandi che descrivono all'interprete cosa fare con i dati nei vari punti del programma.
Tornando all'esempio precedente:

Una istruzione come quelle precedentemente menzionate, seguita dai dati su cui deve essere eseguita e da eventuali opzioni (subcomandi che modificano parzialmente l'azione di un determinato comando) viene definita come espressione.
Nell'esempio precedente ogni riga costituisce un'espressione: un programma è semplicemente costituito da una sequenza di espressioni.

Le stringhe

Quando il REXX incontra un carattere di quotazione (" o ') interrompe l'interpretazione del programma cercando il successivo carattere di quotazione. La frase racchiusa tra i caratteri di quotazione viene definita stringa letterale. Le seguenti espressioni:

"Ciao! Come ti chiami?"
oppure
"Il risultato è:"
sono due esempi di stringhe letterali.
Quando è necessario usare un carattere di quotazione all'interno di una stringa perché essi vengano interpretati correttamente dal REXX si puo' usare un carattere di quotazione dell'altro tipo per racchiudere la stringa:
"Usare un carattere dell'altro tipo"
L'apostrofo contenuto nella stringa precedente viene interpretato correttamente in quanto la stringa è racchiusa da una coppia di ". Se si fossero usati solo ':
'Usare un carattere dell'altro tipo'
l'interprete REXX avrebbe riconosciuto come stringa solo 'Usare un carattere dell' mostrando poi un messaggio di errore per la mancanza di un ' da accoppiare a quello seguente tipo.
Un altro metodo, praticamente l'unico quando la stringa contiene entrambi i tipi di caratteri di quotazione, è raddoppiare un carattere di quotazione (questo vale solo per i caratteri dello stesso tipo di quelli che racchiudono la stringa):
"Ho detto: ""usare due caratteri di quotazione è l'unico modo"""
Quando la stringa viene interpretata ai due caratteri di quotazione successivi ne viene sostituito uno solo. Per questo motivo alla fine della frase dell'esempio precedente ci sono ben tre caratteri di quotazione.
Se avete dei dubbi fate delle prove con dei semplici programmi REXX costituiti da un commento e da una riga con SAY. Per esempio:
/* esempio 5.1 */
SAY "Ho detto: ""usare due caratteri di quotazione è l'unico modo"""

Quando una frase viene elaborata, qualsiasi carattere non racchiuso tra virgolette (" o ') viene convertito in carattere maiuscolo e viene lasciato solo uno spazio tra le parole anche se nella stringa originale ne prevedeva più di uno. Se create il seguente script REXX:

/* SAY.CMD : confrontate il risultato dei seguenti comandi SAY */
SAY Ciao,    come stai?
SAY "Ciao,    come stai?"
SAY Ciao,"    "come stai?
eseguendolo otterrete sullo schermo:
CIAO, COME STAI?
Ciao,    come stai?
CIAO,    COME STAI?
Quindi è possibile mostrare dei caratteri sullo schermo tramite il comando SAY anche se questi non sono racchiusi tra una coppia di virgolette, ma, di solito, si usano sempre le virgolette in modo da poter meglio controllare l'aspetto dei messaggi visualizzati.

Le variabili

Quando è necessario usare informazioni che possono variare, come la risposta introdotta alla domanda "Ciao! Come ti chiami?" nell'esempio precedente, si riserva un posto nella memoria per raccogliere tali informazioni: una variabile. La variabile, infatti, non è altro che un nome simbolico, scelto opportunamente per rendere più chiaro il significato dello script, che indica una posizione della memoria del computer che è stata riservata per raccogliere i dati che l'utente immetterà o che risulteranno dall'elaborazione di altri dati.
Nell'esempio precedente avevamo usato una sola variabile, chiamata nome, riservata per memorizzare il dato introdotto dall'utente in risposta alla domanda posta dal programma.
Quando il REXX elabora un espressione con delle variabili sostituisce alle variabili il valore contenuto nelle locazioni di memoria cui tali variabili fanno riferimento. Così dall'espressione:

say "Ciao" nome
otterremo sullo schermo Ciao seguito dal valore memorizzato nella variabile.

La sintassi

Le regole secondo cui vengono posizionate le varie parole e segni di punteggiatura che sono alla base di un linguaggio costituiscono la Sintassi. Quando il programma interprete del REXX, durante la lettura di uno script incontra qualcosa non rispondente alle regole della sintassi del REXX, si ferma e mostra un messaggio di errore in cui viene riportato sia il numero di riga che un codice relativo al tipo di errore.
Introduciamo un errore nell'esempio precedente:

/* CIAO.CMD : questo è il mio primo programma REXX */
say "Ciao! Come ti chiami?"               /* commento errato
pull nome
if nome = "" then say "Ciao sconosciuto!"
else say "Ciao" nome
L'errore consiste nel non aver completato il commento /* commento errato con un */ di chiusura.
Proviamo ora ad avviare il programma e vediamo cosa ci dice l'interprete del REXX:
REX0006: Error 6 running C:\CIAO.CMD, line 2:
Unmatched "/*" or quote
REX0006 indica il codice di errore dell'interprete del REXX. Per avere maggiori informazioni sull'errore riscontrato basta digitare dalla riga di comando:
HELP REX6
otterremo la seguente spiegazione:
REX0006: ***Unmatched "/*" or quote***

EXPLANATION: A comment or literal string was started but never finished.
             This may be detected at the end of the program (or the end
             of data in an INTERPRET instruction) for comments, or at
             the end of a line for strings.


a cura di Alessandro Cantatore

- [ Pagina precedente ] - - [ Sommario ] - - [ Just WARP! homepage ] - - [ Pagina successiva ] -