Home Rhyylen
Contatto
Programmazione
 
 
V Language
Capitolo 3
I tipi

L'analisi dei tipi è sempre un buon punto di partenza per apprendere un linguaggio. Per cui andiamo subito al sodo e visualizziamo lo schema dei tipi in questo linguaggio:

bool - i classici booleani
string - sequenze immutabili di caratteri UTF-8
i8 i16 int i64 i128 (da implementare) - si tratta dei classici interi - int sta per i32 che è il deafult per i valori numerici
u8 u16 u32 u64 u128 (da implementare) - interi senza segno
rune - rappresenta un code point Unicode
f32 f64 - questi sono i float definiti su 32 e 64 bit rispettivamente
isize, usize - dipendente dalla piazzaforma, e rappresenta l'ampiezza in byte necessaria per rappresentare qualsiasi locazione di memoria
voidptr - usato per l'interoperabilità con il linguaggio C
any - simile al void in C

avrete notato l'assenza del tipo char ma abbiamo visto che c'è il rune ed è questo tipo che ne fa le veci.
Per quanto riguarda i range ne parleremo durante l'analisi dei singoli tipi, ma potete immaginarli da soli, non sono dissimili da tipi analoghi di altri linguaggi.

Come si fa per ricavare il tipo di una variabile? Bisogna ricorrere a:

typeof(variabile).name

ad esempio:

x1 := (7 + 8) * 5    
println (typeof(x1).name)  

PROMOZIONE

Questa è una interessante caratteristica che mi piace molto. In V, come in quasi tutti gli altri linguaggi, è prassi comune che una espressione debba contenere elementi dello stesso tipo a destra e a sinistra. Ad esempio

x1 = x2

è corretta se x1 e x2 sono dello stesso tipo altrimenti deve avvenire un qualche meccanismo di conversione. In V se un elemento ha tutte le caratteristiche necessarie avviene una promozione automatica ad esempio ad un tipo avente range superiore. Questo vale in particolare per i valori numerici. Il sito ufficiale ci presenta il seguente schema:



Attenzione che questo riguarda appunto espressioni sinistra = destra non è una garanzia contro gli overflow di tipo qualora si eseguano operazioni che vanno oltre i range stabiliti per il tipo che si sta utilizzando. Un esempio:

fn main() {    
  x1 :=  7    
  x2 := f32(3.1)    
  x3 := x1 * x2    
  println(x3)  
}


In questo caso alla quarta riga abbiamo la conversione automatica da i32 (x1) a f32.