Elm (linguaggio di programmazione)
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 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/ |
Storia
modificaElm è 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]
Caratteristiche
modificaElm 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.
Immutabilità
modificaTutti 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]
Tipizzazione statica
modificaElm è tipizzato staticamente. Ogni definizione in Elm può ricevere un'annotazione di tipo che descrive la forma esatta del valore. Tra i tipi ci sono:
- tipi primitivi come interi e stringhe
- strutture dati di base come liste, ennuple, e record estendibili
- tipi personalizzati, chiamati `unioni taggate` che consentono di costruire tipi interamente nuovi [16]
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.
Sistema di moduli
modificaElm 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.
Interoperabilità con HTML, CSS, e JavaScript
modificaElm 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]
Limitazioni
modificaDiversamente 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.
Strumenti
modifica- Editor online elm-lang.org/try per facili esperimenti
- Ellie, un editor più avanzato con supporto all'aggiunta di librerie
- La guida ufficiale ed esempi
- Libreria di base e librerie della comunità
- elm-watch per sviluppo con live reload
- elm-review per il linting
- elm-format, il formattatore standard utilizzato dalla maggior parte degli utenti
Codice di esempio
modifica-- 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.
La pipe (|) all'inizio del commento indica che questa è documentazione per il valore che stiamo definendo.
-}
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)
valoreAssoluto : Int -> Int
valoreAssoluto numero =
-- Le espressioni `if` si usano per fare diramazioni in base a valori
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)
Note
modifica- ^ https://github.com/evancz/Elm/blob/master/LICENSE
- ^ Elm home page, su elm-lang.org.
- ^ Elm: Concurrent FRP for Functional GUIs
- ^ Elm's Online Editor, su elm-lang.org. URL consultato il 26 aprile 2025.
- ^ Working on Elm full-time, su elm-lang.org. URL consultato il 26 aprile 2025.
- ^ New Adventures for Elm
- ^ Elm compiler source code
- ^ Elm REPL announcement, su elm-lang.org. URL consultato il 26 aprile 2025.
- ^ Elm Package Manage, su elm-lang.org. URL consultato il 26 aprile 2025.
- ^ Elm's Time-Traveling Debugger, su debug.elm-lang.org. URL consultato il 4 gennaio 2017 (archiviato dall'url originale il 3 maggio 2017).
- ^ Elm Platform
- ^ Elm Public Libraries Archiviato l'11 febbraio 2015 in Internet Archive.
- ^ The Syntax of Elm, su elm-lang.org. URL consultato il 1º maggio 2019 (archiviato dall'url originale il 13 marzo 2016).
- ^ About Elm Archiviato il 30 agosto 2017 in Internet Archive. Elm features
- ^ Elm Standard Libraries
- ^ Model The Problem, su Elm. URL consultato il 4 maggio 2016 (archiviato dall'url originale il 9 maggio 2016).
- ^ Ports, su elm-lang.org. URL consultato il 4 gennaio 2017 (archiviato dall'url originale il 13 marzo 2016).
- ^ elm-html documentation
- ^ Blazing Fast Html, su elm-lang.org. URL consultato il 1º maggio 2019 (archiviato dall'url originale il 13 marzo 2016).
- ^ Higher-Kinded types Not Expressible? #396, su github.com/elm-lang/elm-compiler. URL consultato il 6 marzo 2015.
Collegamenti esterni
modifica- (EN) Sito ufficiale, su elm-lang.org.
- (EN) Elm, su GitHub.
- Repository sorgenti di Elm, su github.com.
