|
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. |