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 , grazie alle verifiche statiche del compilatore Elm.

Storia

Elm è stato progettato inizialmente da Evan Czaplicki come progetto di tesi nel 2012. 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. Evan Czaplicki è entrato a far parte di Prezi nel 2013 per lavorare su Elm, e nel 2016 si è spostato in NoRedInk come ingegnere Open Source, dando inoltre vita alla Elm Software Foundation.

L'implementazione iniziale del compilatore Elm genera codice HTML, CSS, e JavaScript. L'insieme di strumenti di base si è continuato a espandere, e adesso comprende un interprete interattivo, un gestore di pacchetti, un debugger che consente viaggi nel tempo, e degli installatori per Mac e Windows. Inoltre, Elm ha un ecosistema di librerie create dalla comunità di utenti.

Caratteristiche

Elm ha un insieme piccolo ma espressivo di costrutti linguistici, tra cui espressioni `if`, espressioni `let`, espressioni `case`, funzioni anonime, e interpolazioni di lista.About Elm Elm features Le caratteristiche chiave comprendono l'immutabilità, la tipizzazione statica, e l'interoperabilità con HTML, CSS, e JavaScript.

Immutabilità

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.

Tipizzazione statica

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: 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

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

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.

Interoperabilità con HTML, CSS, e JavaScript

Elm usa un'astrazione chiamata "porte" per comunicare con JavaScript. 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. Usa un approccio al DOM virtuale per rendere efficienti gli aggiornamenti.

Limitazioni

Diversamente da Haskell, Elm non supporta i tipi di livello superiore, e quindi non può fornire astrazioni generiche per molte operazioni comuni. 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

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

-- 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

Collegamenti esterni

Categoria:Linguaggi di programmazione funzionali