# 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, 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. 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
* Piattaforma Elm per installare localmente gli strumenti di base
* Debugger che viaggia nel tempo
* Risorse di apprendimento e esempi
* Librerie di base e librerie della comunità