Dart



Primi concetti          

Non si può non iniziare dal classico "Hello, World" che ci darà subito qualche nozione:

  Esempio 1.1
1
2
3
4
5
6
main()
{
  var s1 = "Hello";
  String s2 = "World";
  print("${s1} ${s2}");
}

La riga 1 ci presenta la parola main che costituisce l'entry point del programma. La presenza di main è necessaria in ogni applicazione Dart. La necessità della presenza del main preclude la possibilità di effettuare l'esecuzione di funzioni in maniera libera (o di usare eval()) che si ha in Javascript. Alla 2 ed alla 6 compaiono le consuete graffe in C-style. La riga 3 e la 4 sono interessanti perchè ci svelano le due facce della stessa medaglia ovvero la dichiarazione delle variabili. Alla riga 3 abbiamo una tipizzazione apparentemente ottenuta tramite inferenza (in realtà la cosa non è prorpio così ma in questa fase diamola per quasi buona) mentre alla 4 la tipizzazione è statica ed è specificata una stringa. Ecco quindi introdotto il concetto della opzionalità della tipizzazione statica. Usando la keyword var il programmatore può ricorrere appunto all'inferenza.  La riga 5 ci evidenzia invece la classica interpolazione delle stringhe per le operazioni di output. L'interpolazione permette anche la scrittura di espressioni più complesse e che devono essere valutate al volo

print("il risultato vale:  ${1 +2 +3}"

Per quanto riguarda l'esposizione dell'output non è necessario usare concentenatori per unire più stringhe. Ad esempio:

print("Ciao " "mondo");

stampa "Ciao mondo" (senza apici) a video.

Delle stringhe comunque parleremo nell'apposito paragrafo, le informazioni che trovate qui servono per darvi la possibilità di provare qualche esempio.

Torniamo a questo punto alla dichiarazione delle variabili, che abbiamo visto. Se scrivo:

var x = 1;

intendo dichiarare una variabile che sarà un puntatore ad un oggetto di tipo intero. Il fatto che non siamo di fronte ad una inferenza vera e propria è dato dal fatto che possiamo anche non attribuire alcun valore iniziale a x. L'inferenza vera e propria richiede un valore iniziale per poter dedurre il tipo. Qui non è necessario. Se non diamo un valore iniziale ad x sarà attribuito un valore standard ovvero null. Sarà successivamente possibile attribuire un valore ad x e dal momento che x è dinamico potrà essere anche successivamente ad essa anche un valore di tipo diverso. Insomma è corretto scrivere:

var x;
x = 5;
x = "aaa";


Nei linguaggi statici con inferenza una volta che il tipo è attribuito ad una variabile non può più essere cambiato. Ma Dart non è un linguaggio a tipizzazione statica.

Se invece avessimo attribuito un tipo, effettuando una tipizzazione di tipo statico, come alla riga 4 allora le cose sarebbero diverse. Se nel programma 1.1 alla variabile s2 dopo averla dichiarata alla riga 4 provassimo, successivamente a cambiare tipo di valore, ad esempio scrivendo:

s2 = 6;

riceveremmo una chiara segnalazione di errore:

Exception: type 'int' is not a subtype of type 'String' of 's2'

Anche una variabile statica se non inizializzata riceve valore di default null.

Tra i principali modificatori delle variabili in fase di dicharazione troviamo final e const. Sono molto simili ed entrambe possono essere usate quando volete "blindare" il valore assegnato in fase di codifica. Quale che delle due keyword usiate infatti l'inizializzazione deve essere fatta in fase di dicharazione. Il valore memorizzato non può essere in alcun modo modificato successivamente. Per quanto vi sia una sottile differenza tra le due a questo stadio non saremmo in grado di apprezzare realmente tale differenza sulla quale torneremo.

  Esempio 1.2
1
2
3
4
5
6
main()
{
  final x = 1;
  const int y = 2;
  print (x + y);
}

Un altro modificatore è static. Una variabile dichiarata static non è legata ad alcuna istanza di classe ma è disponibile e visibile per l'intera libreria o classe.

I token che rappresentano gli identificatori, ovvero i loro nomi seguono le classiche regole standard note anche in altri linguaggi: di seguito alcuni esempi:

1x : non è valido, non si può mettere una cifra come primo elemento di un nome di variabile
_1x : va bene, underscore, anche doppio,o triplo ecc... è accettabile
@1x : non va bene, @ : ; ? ^ ! # - + ecc... non vanno bene come primo carattere e nemmeno in mezzo ad altri o alla fine
a1x : con le lettere in "pole position" non ci sono problemi

Se print ci permette di scrivere può essere interessante capire come si fa a leggere una stringa dalla tastiera: il seguente programmino risponde alla domanda, prima di leggerlo ricordate sempre che l'input letto da tastiera viene memorizzato in una stringa.

  Esempio 1.3
1
2
3
4
5
6
import 'dart:io' as io;

main() {
var line = io.stdin.readLineSync();
print(line);
}

Per ora prendetelo per buono, già dal prossimo paragrafo le cose si chiariranno un po'.