Elm (linguaggio di programmazione)

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
AutoreEvan Czaplicki
Data di origine2012
Ultima versione0.19.1 (ottobre 2019)
Utilizzogenerazione pagine Web dinamiche
Paradigmiprogrammazione funzionale
Tipizzazioneforte, statica, inferita
Estensioni comuni.elm
Influenzato daHaskell, Standard ML, OCaml, F#
Implementazione di riferimento
LinguaInglese
LicenzaPermissiva (Revised BSD) [1]
Sito webelm-lang.org/

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]

Caratteristiche

modifica

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.

Immutabilità

modifica

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]

Tipizzazione statica

modifica

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

modifica

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

modifica

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]

Limitazioni

modifica

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.

Strumenti

modifica

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)
  1. ^ https://github.com/evancz/Elm/blob/master/LICENSE
  2. ^ Elm home page, su elm-lang.org.
  3. ^ Elm: Concurrent FRP for Functional GUIs
  4. ^ Elm's Online Editor, su elm-lang.org. URL consultato il 26 aprile 2025.
  5. ^ Working on Elm full-time, su elm-lang.org. URL consultato il 26 aprile 2025.
  6. ^ New Adventures for Elm
  7. ^ Elm compiler source code
  8. ^ Elm REPL announcement, su elm-lang.org. URL consultato il 26 aprile 2025.
  9. ^ Elm Package Manage, su elm-lang.org. URL consultato il 26 aprile 2025.
  10. ^ Elm's Time-Traveling Debugger, su debug.elm-lang.org. URL consultato il 4 gennaio 2017 (archiviato dall'url originale il 3 maggio 2017).
  11. ^ Elm Platform
  12. ^ Elm Public Libraries Archiviato l'11 febbraio 2015 in Internet Archive.
  13. ^ The Syntax of Elm, su elm-lang.org. URL consultato il 1º maggio 2019 (archiviato dall'url originale il 13 marzo 2016).
  14. ^ About Elm Archiviato il 30 agosto 2017 in Internet Archive. Elm features
  15. ^ Elm Standard Libraries
  16. ^ Model The Problem, su Elm. URL consultato il 4 maggio 2016 (archiviato dall'url originale il 9 maggio 2016).
  17. ^ Ports, su elm-lang.org. URL consultato il 4 gennaio 2017 (archiviato dall'url originale il 13 marzo 2016).
  18. ^ elm-html documentation
  19. ^ Blazing Fast Html, su elm-lang.org. URL consultato il 1º maggio 2019 (archiviato dall'url originale il 13 marzo 2016).
  20. ^ Higher-Kinded types Not Expressible? #396, su github.com/elm-lang/elm-compiler. URL consultato il 6 marzo 2015.

Collegamenti esterni

modifica
  Portale Informatica: accedi alle voci di Wikipedia che trattano di informatica