Puliamo bene la lavagna. Facciamo un respiro profondo. Prendiamo il gessetto e cominciamo a fare un po’ di matematica.
Nel linguaggio di programmazione Tcl il comando per comporre delle espressioni matematiche, logiche o relazionali è expr.
Grazie al comando expr possiamo anche lavorare con le funzioni.
Molti comandi Tcl utilizzano al loro interno proprio il comando
exprper compiere determinate azioni.
Una espressione Tcl restituisce sempre un risultato. D’altronde, se non lo facesse, che ce ne faremmo di una espressione? 😉
Ingredienti per una gustosa espressione
Gli ingredienti principali per comporre una espressione sono:
- operandi:
- numeri interi o a virgola mobile
- stringhe racchiuse tra una coppia di doppie virgolette alte
"..." - valori booleani:
1o0,trueofalse,yesono,onooff - valori di variabili anteponendo al nome della variabile il carattere
$
- operatori: aritmetici, logici, sui bit
- funzioni matematiche
- parentesi tonde
Nota: per ottenere delle performance migliori, è conveniente inserire gli argomenti di una espressione all’interno di una coppia di parentesi graffe {...}.
Operandi
L’interprete Tcl, se possibile, tratta gli operandi come numeri interi.
Numeri interi
I numeri interi possono essere espressi come:
- decimali
- binari (anteponendo i caratteri
0b) - ottali (anteponendo i caratteri
0o) - esadecimali (anteponendo i caratteri
0x)
Numeri a virgola mobile
Se l’interprete non può considerare un operando come intero, allora lo considererà come numero a virgola mobile.
I numeri a virgola mobile possono essere rappresentati in una delle seguenti modalità:
18.43
7.
2E3
3.62e+14
.00004
Stringhe
Se non è possibile una interpretazione numerica, allora l’operando viene considerato come stringa.
Vediamo un esempio:
set x 2,1
puts [expr {$x > 2}]
---
1
In questo caso, avendo erroneamente utilizzato la virgola al posto del punto per rappresentare il nostro numero, il risultato dell’espressione sarà true (vero) in quanto la stringa "2,1" viene dopo la stringa "2".
Operatori
Gli operatori lavorano generalmente sui numeri. Alcuni operatori però possono lavorare soltanto sui numeri interi o sulle stringhe.
Operazioni sui numeri
A seguire, in ordine decrescente di precedenza di calcolo, la lista degli operatori che lavorano su qualsiasi tipo di numero:
- +operatore unario**esponenziale* /moltiplicazione e divisione+ -somma e sottrazione== != < > <= >= >operatori relazionali (restituiscono1per il valoretrueo0perfalse)
Operazioni esclusive per i numeri interi
% funzione modulo (resto della divisione euclidea)
Operazioni su stringhe
== != < > <= >= >operatori relazionali (restituiscono1per il valoretrueo0perfalse)eq ne in nicomparazione tra stringhe di uguaglianza, disuguaglianza, se presente in un’altra stringa o se non presente (restituiscono1per il valoretrueo0perfalse)
Occorre fare molta attenzione a non confondere la comparazione di uguaglianza/disuguaglianza con gli operatori relazionali == e != che potrebbero interpretare delle stringhe come numeri.
Vediamo un esempio:
puts [expr {"9" == "9.0"}]; # otteniamo 1 (le stringhe vengono interpretate come numeri)
puts [expr {"9" eq "9.0"}]; # otteniamo 0 (le stringhe vengono interpretate come stringhe)
---
1
0
Operazioni logiche
Questo tipo di operatori possono essere combinati tra loro sino a formare delle espressioni anche molto complicate.
&&AND logico||OR logicox?y:zIF-THEN-ELSE (l’operandoxdeve essere un valore numerico: sexè valutato non-zero, allora viene eseguitoyaltrimentiz.
set x 8
puts [expr {$x % 2 ? "odd" : "even"}]
---
even
Funzioni matematiche
Nelle nostre espressioni Tcl possiamo anche far uso di diverse funzioni già disponibili.
Ecco la lista:
abs acos asin atan
atan2 bool ceil cos
cosh double entier exp
floor fmod hypot int
isqrt log log10 max
min pow rand round
sin sinh sqrt srand
tan tanh wide
Funzioni di conversione
L’interprete Tcl ci permette anche di operare delle conversioni tra tipi di numeri o tra numeri e stringhe e viceversa.
double() converte un numero intero in un numero a virgola mobile
int() converte un numero a virgola mobile in un numero intero (troncando la parte decimale)
wide() converte un numero intero standard in un numero intero con un range più ampio
entier() converte un numero a virgola mobile in un numero intero senza troncamento
Nel prossimo articolo discuteremo di alcuni aspetti importanti che riguardano la modalità con cui un computer tratta i numeri e come queste modalità possano avere un impatto sulla precisione del calcolo.
