![]() |
Corso di programmazione in REXX - Lezione 3 - nozioni di base![]() |
Nota: i sorgenti descritti in questo numero sono stati raccolti
nel file rxsource.zip (915 byte).
Le espressioni Alcuni esempi di espressioni REXX: /* espressioni aritmetiche */ say 3 + 2 /* mostra "5" */ say 3 * 2 /* mostra "6" */ say 3 2 /* mostra "3 2" */ say 3||2 /* mostra "32" */ /* stringhe letterali */ say "box" "car" /* mostra "box car" */ say "box""car" /* mostra "box"car" */ say "box"||"car" /* mostra "boxcar" */ /* alcune variabili */ x = 6 y = 7 say x + y /* mostra "13" */ x = x + y say x /* mostra "13" */
I termini
I principali operatori Alcuni esempi di operatori aritmetici sono: /* addizione, sottrazione e moltiplicazione */ say 14 + 5 /* mostra "19" */ say 14 - 5 /* mostra "9" */ say 14 * 5 /* mostra "70" */ /* divisione normale */ say 14 / 5 /* mostra "2.8" */ /* mostra solo la parte intera del risultato */ say 14 % 5 /* mostra "2" */ /* mostra solo il resto della divisione */ say 14 // 5 /* mostra "4" */ Nota: l'uso del REXX per i calcoli matematici verrà approfondito in una delle prossime lezioni. Gli operatori di concatenazione servono ad unire una o più stringhe:
Precedenza degli operatori Il REXX dà precedenza alla divisione rispetto alla concatenazione. Infatti il REXX prevede un insieme di regole che definiscono l'ordine in cui le varie operazioni di un'espressione devono essere eseguite. Come regola di base l'espressione viene valutata da sinistra a destra, ma l'ordine di elaborazione viene modificato dalla presenza di parentesi e dalla precedenza degli operatori. Cioè alcune operazioni acquisiscono una maggiore priorità e vengono elaborate prima di altre indipendentemente dall'ordine di apparizione nell'espressione. Per esempio la moltiplicazione o la divisione hanno maggior priorità di somma e sottrazione e queste ultime precedono a loro volta l'operatore di concatenazione.
Per cambiare l'ordine di valutazione, per esempio per dividere una somma,
è necessario racchiudere le operazioni con minor priorità tra parentesi.
Le funzioni say length("parola") /* mostra sullo schermo la lunghezza */ /* dell'argomento "parola" */Il dato su cui si vuol fare operare la funzione viene detto argomento o parametro della funzione. Nell'esempio precedente l'argomento è la stringa letterale "parola" ed il valore prodotto dalla funzione è il suo valore di ritorno. Il valore di ritorno dipende dall'argomento introdotto. Nel nostro caso il valore restituito è "6" cioè il numero di caratteri che compongono l'argomento "parola". Nel caso di un argomento differente, per esempio: say lenght("argomento più lungo") /* mostra sullo schermo la lunghezza */ /* dell'argomento "argomento più lungo" */sullo schermo verrà mostrato "19.
L'argomento di una funzione può essere esso stesso un'espressione. say abs(2 - (50 * 2)) /* mostra "98" */prima viene calcolato il risultato di 2 - (50 * 2), cioè "-98", e poi questo viene passato ad ABS(). Se una funzione permette o richiede più argomenti, questi dovranno essere separati da una virgola: say copies("=", 80) /* mostra una sequenza di 80 caratteri "=" */ Le funzioni, a volte, non necessitano di alcun argomento. Per esempio la funzione DATE() usata per mostrare la data dell'orologio di sistema accetta diversi argomenti: say date() /* senza argomenti mostra la data corrente come */ /* per esempio: 8 Oct 1997 */ say date("W") /* mostra il giorno della settimana, in inglese */ /* "Weekday". Per esempio: "Wednesday" */ say date("S") /* dove "S" è l'iniziale di "Sorted" (ordinato) */ /* mostra la data come anno-mese-giorno. */ /* Per esempio "19971008" */ La funzione DATATYPE() riporta il tipo di dati da essa valutato: str1 = "ABC" /* una stringa di caratteri */ str2 = "12" /* una stringa numerale */ say datatype(str1) /* mostra sullo schermo "CHAR" */ say datatype(str2) /* mostra sullo schermo "NUM" */ Una chiamata di funzione può essere inclusa in una parte qualsiasi di un'espressione. L'interprete del REXX esegue l'elaborazione corrispondente alla funzione chiamata, sostituendo poi il valore risultante prima di valutare la restante parte dell'espressione. L'esempio seguente: say length("parola") + 10 - length("a")equivale a: say 6 + 10 - 1cioè la lunghezza di "parola" + 10 - la lunghezza di "a".
Comparazione di dati
Il segno di uguaglianza ("=") ha un significato differente a seconda della sua posizione nella linea di codice. Per esempio: ammonto = 5 /* assegna il valore 5 alla variabile */ say ammonto = 5 /* compara il valore della variabile ammonto */ /* con 5. Se l'uguaglianza viene soddisfatta */ /* mostra "1" (VERO), altrimenti "0" (FALSO) */Generalmente quando il segno = si trova all'inizio dell'espressione rappresenta un operazione di asegnamento, negli altri casi rappresenta un'operazione di comparazione. Solo nell'istruzione PARSE, come vedremo nelle prossime lezioni, o quando è racchiuso in un commento, ha un significato differente.
Valori logici: VERO e FALSO /* alcune comparazioni */ say 5 = 5 /* mostra '1' (VERO) */ say 5 <> 5 /* mostra '0' (FALSO) */ say 5 = 4 /* mostra '0' */ say 2 + 2 = 4 /* mostra '1' */ say 2 + 2 = 5 /* mostra '0' */ quanta = 2 + 3 /* assegna il risultato della somma */ /* di 2 e 3 alla variabile quanta */ say "mele" = "banane" /* mostra '0' (FALSO) */ frutta = "banane" /* assegna il valore "banane" alla */ /* variabile frutta */ say frutta = "mele" /* mostra '0' */ say frutta = "banane" /* mostra '1' */ say quanta frutta /* mostra "5 banane" */ say quanta frutta = "4 banane" /* mostra '0' */ say quanta frutta = "5 prugne" /* mostra '0' */ say quanta frutta = "5 banane" /* mostra '1' */
Combinazione di espressioni Si possono combinare delle espressioni di comparazione:
Uso della comparazione per il controllo dei programmi
Nelle istruzioni del tipo IF (se) espressione THEN...
(allora...),
il risultato dell'espressione deve essere solo 0 (FALSO) o
1 (VERO) perché il codice venga ritenuto valido. PRONTO = "SI" /* assegna il valore "SI" alla variabile */ IF PRONTO = "SI" THEN... /* dato che la comparazione di "PRONTO" */ /* con "SI" dà come risultato 1, viene */ /* eseguita la linea di codice successiva */
Nel caso si voglia controllare la sequenza di elaborazione di uno script REXX, per esempio se un programma produce risultati inaspettati, si può usare l'istruzione TRACE. Tale istruzione mostra come l'interprete del REXX valuta le espressione durante l'esecuzione del programma. Le opzioni più usate sono:
TRACE I espressione 1 ... espressione nIl seguente esempio mostra come viene usata l'istruzione TRACE: /* ITRACE.CMD: mostra come un'espressione viene */ /* valutata, operazione per operazione */ x = 9 y = 2 trace I /* abilita il tracing */ if x + 1 > 5 * y then /* se il risultato della */ /* comparazione è '1' */ say "x è abbastanza grande!" /* ...mostra questo. */L'esecuzione del programma mostra sullo schermo: [C:\]ITRACE 6 *-* If x + 1 > 5 * y; >V> "9" >L> "1" >O> "10" >L> "5" >V> "2" >O> "10" >O> "0" >>> "0" [C:\]I simboli significano:
Nel caso si desideri controllare solo il risultato finale delle espressioni presenti nel programma, si dovrà invece usare TRACE R espressione 1 ... espressione nIl seguente esempio mostra un'impiego pratico di TRACE R: /* RTRACE.CMD */ x = 9 y = 2 trace R /* abilita il tracing. */ if x + 1 > 5 * y then /* se il risultato della */ /* comparazione è '1' */ say "x è abbastanza grande" /* ...mostra questo. */Questa volta avremo sullo schermo: [C:\]RTRACE 5 *-* If x + 1 > 5 * y; >>> "0" [C:\]Anche in questo caso il simbolo >>> indica il risultato finale e ancora la frase "x è abbastanza grande" non viene mostrata perché non si verifica la condizione necessaria (10 > 10). |