Scala: Espressioni

La serie di articoli su Scala continua con le espressioni. Le espressioni sono uno dei fondamenti della programmazione funzionale, perché non hanno alcun side effect (restituscono “nuovi” dati invece di modificarne di esistenti), e il poter lavorare con dati immutabili è uno dei vantaggi della programmazione funzionale.

La più semplice espressione che possiamo incontrare è un literal, che può essere una stringa, in intero o qualunque altro tipo di base:

Quando parliamo di espressioni stiamo parlando sia di literal che di valori calcolati (come una concatenazione di stringhe, ad esempio), e abbiamo visto come lo Scala REPL assegni questi literal a dei value chiamati resX (dove X è un sequenziale). Viene da sé che possiamo dichiarare value o variabili e assegnargli il risultato di un’espressione (senza saperlo l’abbiamo già fatto quando abbiamo affrontato i tipi).

La sintassi generale è

val <identifier> [: <type>] = <expression>
var <identifier> [: <type>] = <expression>

Blocchi

E’ possibile combinare più espressioni all’interno di una coppia di parentesi graffe aperta/chiusa per formare un blocco. Ogni espressione del blocco ha come scope il blocco stesso, quindi esiste (è visibile) soltanto all’interno di esso. L’ultima espressione nel blocco determina il tipo del blocco stesso:


val risposta = {val r="La risposta alla domanda fondamentale sulla vita, l'universo e tutto quanto \u00E8 "; r+42}

Se diamo questo codice in pasto all’interprete Scala ci verrà detto che risposta è una stringa, e se proviamo ad accedere a r, che è dichiarata all’interno del blocco, veniamo presi a male parole:
(non smetterò mai di ringraziare Douglas Adams e la sua Guida Galattica per autostoppisti per avermi fornito un campionario di frasi con cui sostituire Hello world). Possiamo anche allargare l’espressione su più righe, andando a capo con SHIFT+INVIO:

 

Così è molto più leggibile (risultato a parte, ma viene visualizzato un po’ da schifo dall’interprete di IntelliJ Community, su PowerShell quei pipe non li vedete. Un blocco può essere racchiuso anche all’interno di un altro blocco:

ma sintassi simili sono vietate dalla Convenzione di Ginevra.

Statement

Uno statement (la traduzione sarebbe dichiarazione, ma poi ci potrebbe indurre un po’ di confusione) è un’espressione che non restituisce nessun valore. Le abbiamo già incontrate quando andavamo a dichiarare un value o una variabile: in quel caso l’interprete ci stampava a video un “recap” della definizione di quell’oggetto (nell’esempio sopra gatti: Int = 44), ma il valore restituito di fatto era Unit, il tipo che in Scala denota proprio la mancanza di valore (potremmo quasi paragonarlo a void). Proprio perché uno statement non ha output viene comunemente usato per modificare dati o per eseguire attività fuori dallo scope dell’applicazione (stampare un messaggio a video, eseguire un’interrogazione su un DB…).

 

 

Pierpaolo Paris

Sono uno dei tanti che sono entrati nel girone infernale di Ingegneria Informatica, e che poi ne è anche uscito. Attualmente lavoro come sviluppatore presso una società di consulenza. Ogni tanto mi diletto con la fotografia.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.