Espressioni

Mentre i linguaggi imperativi sono basati su istruzioni che modificano lo stato della macchina astratta, i linguaggi funzionali si basano su espressioni la cui valutazione produce dei valori. In particolare, ogni linguaggio di programmazine funzionale fornisce:

Read-eval-print loop

Per i linguaggi funzionali è comune disporre di un linguaggio interprete interattivo, detto real-eval-print loop (REPL) perchè è un programma che iterativamente (loop):

  1. prende come input una singola espressione (read),
  2. la valuta (eval),
  3. mostra il risultato all’utente (print)

Per il linguaggio Scala è disponibile un REPL che può essere eseguito da riga di comando oppure tramite un IDE.

Esempi di uso del REPL di Scala

Se si inserisce nel REPL un’espressione, il REPL risponde indicandone il tipo e il valore:

scala> 12 + 24 * 2
res0: Int = 60

Ad esempio, in questo caso, Int rappresenta il tipo intero, 60 è il valore dell’espressione. Inoltre, il REPL associa un nome al valore dell’espressione, qui res0, che in seguito può essere utilizzato per far riferimento a tale valore:

scala> res0 + 20
res1: Int = 80

All’interno del REPL è anche possibile definire dei nomi associati a delle espressioni, usando la parola riservata def seguita da un identificatore, dal simbolo = e dall’espressione da associare:

scala> def radius = 10
radius: Int

scala> def pi = 3.14159
pi: Double

Si noti che questi non sono variabili (mutable), ma appunto nomi a cui sono associate delle espressioni non modificatibili. Si osservi inoltre che i tipi di queste definizioni non sono specificati esplicitamente, ma piuttosto vengono dedotti dall’interprete in base ai tipi delle espressioni specificate alla destra dell’uguale; dopo la valutazione di ciascuna definizione, il REPL ne mostra il tipo.

I nomi definiti possono essere usati in un’espressione: