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 expr per 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: 1 o 0, true o false, yes o no, on o off
    • 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:

  1. - + operatore unario
  2. ** esponenziale
  3. * / moltiplicazione e divisione
  4. + - somma e sottrazione
  5. == != < > <= >= > operatori relazionali (restituiscono 1 per il valore true o 0 per false)

Operazioni esclusive per i numeri interi

% funzione modulo (resto della divisione euclidea)

Operazioni su stringhe

  1. == != < > <= >= > operatori relazionali (restituiscono 1 per il valore true o 0 per false)
  2. eq ne in ni comparazione tra stringhe di uguaglianza, disuguaglianza, se presente in un’altra stringa o se non presente (restituiscono 1 per il valore true o 0 per false)

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.

  1. && AND logico
  2. || OR logico
  3. x?y:z IF-THEN-ELSE (l’operando x deve essere un valore numerico: se x è valutato non-zero, allora viene eseguito y altrimenti z.
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.