Nim language



I numeri          

Primo tipo di dato con cui lavoreremo sono i numeri. Il formato, come da documentazione ufficiale, è il seguente:

TABELLA 3-1
hexdigit = digit | 'A'..'F' | 'a'..'f'
octdigit = '0'..'7'
bindigit = '0'..'1'
HEX_LIT = '0' ('x' | 'X' ) hexdigit ( ['_'] hexdigit )*
DEC_LIT = digit ( ['_'] digit )*
OCT_LIT = '0' ('o' | 'c' | 'C') octdigit ( ['_'] octdigit )*
BIN_LIT = '0' ('b' | 'B' ) bindigit ( ['_'] bindigit )*

INT_LIT = HEX_LIT
        | DEC_LIT
        | OCT_LIT
        | BIN_LIT

INT8_LIT = INT_LIT ['\''] ('i' | 'I') '8'
INT16_LIT = INT_LIT ['\''] ('i' | 'I') '16'
INT32_LIT = INT_LIT ['\''] ('i' | 'I') '32'
INT64_LIT = INT_LIT ['\''] ('i' | 'I') '64'

UINT_LIT = INT_LIT ['\''] ('u' | 'U')
UINT8_LIT = INT_LIT ['\''] ('u' | 'U') '8'
UINT16_LIT = INT_LIT ['\''] ('u' | 'U') '16'
UINT32_LIT = INT_LIT ['\''] ('u' | 'U') '32'
UINT64_LIT = INT_LIT ['\''] ('u' | 'U') '64'


Il che più o meno è simile a quanto visto in altri linguaggi. Non ci sono molte particolarità.
I numeri ottali hanno prefisso 0o oppure 0c o anche 0C, i numeri in formato binario li dobbiamo gestire tramite il prefisso 0b e gli esadecimali col classico 0x. I decimali ammettono la presenza del carattere underscore al loro interno per facilitare la lettura. Anche i numeri float possono essere espressi in notazione binaria, ottale o esadecimale.
Esiste un suffisso letterale per ogni tipologia di numero, come si nota anche nella tabella precedente, se all'interno troviamo 'e' oppure 'E' (senza apici) significa che ci troviamo di fronte ad un numero in virgola espresso in notazione esponenziale. La lista dei suffissi letterali la trovate nella tabella 3-2 qui di seguito.

TABELLA 3-2
'i8   int8
'i16  int16
'i32  int32
'i64  int64
'u    uint
'u8   uint8
'u16  uint16
'u32  uint32
'u64  uint64
'f    float32
'd    float64
'f32  float32
'f64  float64
'f128 float128

Il tipo standard per gli interi è int32, indicato come int, si esegua il seguente esempio come riprova:

  Esempio 3.1
1
2
3
import typetraits
var x = 12
echo x.type.name

Se vogliamo forzare un tipo, come da sintassi, basta scrivere ad esempio:

var x = 12i8

Le operazioni di base sono le solite, naturalmente:

  Esempio 3.2
1
2
3
5
6
7
8
var
  x = 7
  y = 3
echo (x + y)
echo (x - y)
echo (x / y)
echo (x * y)

E' interessante notare come, a mio avviso giustamente, il risultato della divisione sia un numero con la virgola. Come dico sempre, 7 diviso 3 fa 2,333333... non 2. Se volete effettuare una divisione il cui risultato sia solo la parte intera, il quoziente, in Nim potete usare la funzione div, mentre il resto di una divisione è fornito da un'altra funzione, mod.

echo (7 div 3) restituisce 2
echo (7 mod 3) restituisce 1

L'elevamento a potenza è realizzato tra interi tramite ^ mentre se usate dei float potrete utilizzare la funzione pow, in entrambi i casi previa inclusione della libreria matematica math.

  Esempio 3.3
1
2
3
5
6
7
8
9
import math
var
  x = 7
  y = 3
  z = 3.3
  t = 4.4
echo (x ^ y)
echo(pow(z,t))

Sia ^ che pow funzionano coi loro tipi naitivi, quindi due int o due float, non è possibile mischiare. E se proprio devo? Vi serve una conversione di tipo. Ritorneremo su questo importante argomento più avanti, per ora propongo una soluzione volante:

echo(pow(z,float32(x)))

la parte in rosso effettua una conversione da int a float32.

La libreria math ha ovviamente numerose altre funzioni pronte all'uso e vi consiglio di dargli un'occhiata sul sito ufficiale.

Il discorso relativo ai float non è molto diverso.

  Esempio 3.4
1
2
3
5
6
7
8
var
  z = 3.3
  t = 4.4
echo (z + t)
echo (z - t)
echo (z * t)
echo (z / t)

Non si possono invece applicare div e mod su questa tipologia di numeri.