Elm linguaggio di programmazione | |
---|---|
![]() | |
Autore | Evan Czaplicki |
Data di origine | 2012 |
Ultima versione | 0.19.1 (ottobre 2019) |
Utilizzo | generazione pagine Web dinamiche |
Paradigmi | programmazione funzionale |
Tipizzazione | forte, statica, inferita |
Estensioni comuni | .elm |
Influenzato da | Haskell, Standard ML, OCaml, F# |
Implementazione di riferimento | |
Lingua | Inglese |
Licenza | Permissiva (Revised BSD) [1] |
Sito web | elm-lang.org/ |
Elm è un linguaggio di programmazione domain-specific per creare interfacce utente grafiche di tipo declarativo basate su browser web. Elm è puramente funzionale, ed è sviluppato dando priorità all'usabilità, alle prestazioni, e alla robustezza. Sostiene di evitare praticamente qualunque eccezione in fase di esecuzione [2], grazie alle verifiche statiche del compilatore Elm.
Elm è stato progettato inizialmente da Evan Czaplicki come progetto di tesi nel 2012.[3] I primo rilascio di Elm era accompagnato da molti esempi e da un editor online che rendeva facile provare il linguaggio in un browser Web.[4] Evan Czaplicki è entrato a far parte di Prezi nel 2013 per lavorare su Elm,[5] e nel 2016 si è spostato in NoRedInk come ingegnere Open Source, dando inoltre vita alla Elm Software Foundation.[6]
L'implementazione iniziale del compilatore Elm genera codice HTML, CSS, e JavaScript.[7] L'insieme di strumenti di base si è continuato a espandere, e adesso comprende un interprete interattivo,[8] un gestore di pacchetti,[9] un debugger che consente viaggi nel tempo,[10] e degli installatori per Mac e Windows.[11] Inoltre, Elm ha un ecosistema di librerie create dalla comunità di utenti.[12]
Elm ha un insieme piccolo ma espressivo di costrutti linguistici, tra cui espressioni `if`, espressioni `let`, espressioni `case`, funzioni anonime, e interpolazioni di lista.[13][14] Le caratteristiche chiave comprendono l'immutabilità, la tipizzazione statica, e l'interoperabilità con HTML, CSS, e JavaScript.
Tutti i valori in Elm sono immutabili, cioè nessun valore può essere modificato dopo che è stato creato. Elm usa strutture dati persistenti per implementare le sue librerie Array
, Dict
, e Set
.[15]
Elm è tipizzato staticamente. Ogni definizione in Elm può ricevere un'annotazione di tipo che descrive la forma esatta del valore. Tra i tipi ci sono:
Elm supporta anche la completa inferenza di tipo, così che il compilatore possa verificare che un programma sia type-safe anche senza annotazioni di tipo.
Elm ha un sistema di moduli che consente ai programmatori di suddividere il loro codice in parti più piccole, chiamate "moduli". I programmatori possono importare ed esportare simboli, rendendo possibile nascondere i dettagli implementativi che non sono necessari agli altri moduli. I moduli formano la base del sito Web della libreria della comunità di Elm, la Elm Public Library.
Elm usa un'astrazione chiamata "porte" per comunicare con JavaScript.[17] Consente ai valori di fluire dentro e fuori da programmi Elm, rendendo possibile comunicare fra Elm e JavaScript.
Elm ha una libreria chiamata "elm-html", che i programmatori possono usare per specificare codice HTML e CSS dall'interno di Elm.[18] Usa un approccio al DOM virtuale per rendere efficienti gli aggiornamenti.[19]
Diversamente da Haskell, Elm non supporta i tipi di livello superiore, e quindi non può fornire astrazioni generiche per molte operazioni comuni.[20] Per esempio, non ci sono funzioni generiche map
, apply
, fold
, né filter
. Invece, tali nomi si usano prefissi dal nome del modulo in cui sono definiti, come per List.map
e Dict.map
.
-- Questo è un commento su una sola riga
{- Questo è un commento su più righe.
Può estendersi su molte righe.
-}
{- I commenti su più righe possono essere {- annidati -} -}
-- Qui definiamo un valore chiamato ''saluti''. Il tipo viene inferito essere String.
saluti =
"Hello World!"
-- È meglio aggiungere annotazioni di tipo alle dichiarazioni di primo livello.
ciao : String
ciao =
"Ehilà."
-- Le funzioni si dichiarano allo stesso modo, con gli argomenti che seguono il nome della funzione.
aggiungi x y =
x + y
-- Ancora, è meglio aggiungere le annotazioni di tipo.
ipotenusa : Float -> Float -> Float
ipotenusa a b =
sqrt (a^2 + b^2)
-- Le espressioni `if` si usano per fare diramazioni in base a valori
valoreAssoluto : Int -> Int
valoreAssoluto numero =
if numero < 0 then -numero else numero
-- I record si usano per tenere valori in campi aventi un nome
libro : { titolo:String, autore:String, pagine:Int }
libro =
{ titolo = "Steppenwolf"
, autore = "Hesse"
, pagine = 237
}
-- Possiamo creare tipi completamente nuovi usando la parola-chiave `type`.
-- Il seguente valore rappresenta un albero binario.
type Albero a
= Vuoto
| Nodo a (Albero a) (Albero a)
-- È possibile ispezionare questi tipi usando espressioni `case`.
profondita : Albero a -> Int
profondita albero =
case albero of
Vuoto -> 0
Nodo valore sinistra destra ->
1 + max (profondita sinistra) (profondita destra)