Elm (linguaggio di programmazione): differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
Eliminate categorie inesistenti
m Bot: inserimento portale (via JWB)
 
(30 versioni intermedie di 19 utenti non mostrate)
Riga 1:
{{Linguaggio di programmazione
|nome = Elm
 
|autore = [[Evan Czaplicki]]
|data = [[2012]]
|versione = 0.1819.1 (ottobre 2019)
|utilizzo = generazione pagine Web dinamiche
|paradigmi = [[programmazione funzionale]]
|tipizzazione = forte, statica, inferita
|estensione = .elm
|influenzato_da = [[Haskell (linguaggio)|Haskell]], [[Standard ML]], [[OCaml]], [[F Sharp (programming language)|F#]]
|ha_influenzato = <!-- Lista di linguaggi influenzati dal linguaggio in esame, citare le fonti -->
|implementazione_riferimento = <!-- Implementazione di riferimento: compilatore o interprete? -->
Riga 15 ⟶ 14:
|licenza = Permissiva ([[BSD license|Revised BSD]]) <ref name=license>https://github.com/evancz/Elm/blob/master/LICENSE</ref>
|lingua = Inglese
|sito_web = {{URL|elm-lang.org}}
}}
 
'''Elm''' è un [[linguaggio di programmazione]] ___domain-specific per creare dichiarativamente [[GUI|interfacce- utente grafiche]] di tipo declarativo basate su [[browser web]]. Elm è puramente [[funzionale]], ed è sviluppato dando priorità all'[[usabilità]], alle prestazioni, e alla [[Robustezza (informatica)|robustezza]]. Sostiene di evitare praticamente qualunque eccezione in fase di esecuzione <ref>{{citeCita web|url=httphttps://elm-lang.org/|titletitolo=Elm home page}}</ref>, grazie alle verifiche statiche del [[compilatore]] Elm.
 
== Storia ==
 
Elm è stato progettato inizialmente da Evan Czaplicki come progetto di tesi nel 2012. <ref>[httphttps://elm-lang.org/assets/papers/concurrent-frp.pdf Elm: Concurrent FRP for Functional GUIs]</ref> 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. <ref>[http{{Cita web |url=https://elm-lang.org/try |titolo=Elm's Online Editor] |accesso=26 aprile 2025 }}</ref> Evan Czaplicki joinedè entrato a far parte di [[Prezi]] innel 2013 toper worklavorare onsu Elm,<ref>[http{{Cita web |url=https://elm-lang.org/blognews/announce/Elmelm-and-Prezi.elmprezi|titolo=Working on Elm joinsfull-time Prezi]|accesso=26 aprile 2025 }}</ref> ande innel 2016 movedsi toè spostato in [[NoRedInk]] ascome aningegnere [[Open Sourcesource|Open EngineerSource]], alsodando inoltre startingvita thealla Elm Software Foundation.<ref>[httphttps://elm-lang.org/blog/new-adventures-for-elm New Adventures for Elm]</ref>
 
L'implementazione iniziale del compilatore Elm genera codice HTML, CSS, e JavaScript. <ref>[https://github.com/elm-lang/Elm Elm compiler source code]</ref> L'insieme di strumenti di base si è continuato a espandere, e adesso comprende un [[Read–eval–print loop|interprete interattivo]], <ref>[http{{Cita web |url=https://elm-lang.org/blognews/announce/Repl.elmrepl |titolo=Elm REPL announcement] |accesso=26 aprile 2025 }}</ref> un gestore di pacchetti, <ref>[http{{Cita web |url=https://elm-lang.org/blognews/announce/PackageManager.elmpackage-manager |titolo=Elm Package ManagerManage announcement]|accesso=26 aprile 2025 }}</ref> un debugger che consente viaggi nel tempo, <ref>[{{Cita web |url=http://debug.elm-lang.org/# |titolo=Elm's Time-Traveling Debugger] |accesso=4 gennaio 2017 |urlarchivio=https://web.archive.org/web/20170503192633/http://debug.elm-lang.org/# |dataarchivio=3 maggio 2017 |urlmorto=sì }}</ref> e degli installatori per Mac e Windows.<ref>[https://github.com/elm-lang/elm-platform Elm Platform]</ref> Inoltre, Elm ha un ecosistema di librerie create dalla comunità di utenti. <ref>[httphttps://package.elm-lang.org/packages/ Elm Public Libraries] {{webarchive|url=https://web.archive.org/web/20150211183935/http://package.elm-lang.org/packages/ |data=11 febbraio 2015 }}</ref>
 
== 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. <ref name="syntax">[http{{Cita web |url=https://elm-lang.org/learn/Syntax.elm |titolo=The Syntax of Elm] |accesso=1 maggio 2019 |urlarchivio=https://web.archive.org/web/20160313052210/http://elm-lang.org/learn/syntax.elm |dataarchivio=13 marzo 2016 |urlmorto=sì }}</ref><ref>[httphttps://elm-lang.org/About.elm About Elm] {{Webarchive|url=https://web.archive.org/web/20170830200520/http://elm-lang.org/About.elm# |data=30 agosto 2017 }} Elm features</ref> 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 suasue librerie <code>Array</code>, <code>Dict</code>, e <code>Set</code>. <ref>[httphttps://package.elm-lang.org/packages/elm-lang/core/latest/ Elm Standard Libraries]</ref>
 
=== Tipizzazione statica ===
Riga 39 ⟶ 37:
* 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 <ref>{{citeCita web|titletitolo=Model The Problem|url=httphttps://elm-lang.org/guide/model-the-problem|websitesito=Elm|accessdateaccesso=4 Maymaggio 2016|refcid=tagged-unions|urlarchivio=https://web.archive.org/web/20160509201212/http://elm-lang.org/guide/model-the-problem|dataarchivio=9 maggio 2016|urlmorto=sì}}</ref>
 
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.
Riga 45 ⟶ 43:
=== 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|sito Web]] della libreria deladella comunità di Elm, la [https://web.archive.org/web/20150211183935/http://package.elm-lang.org/packages/ Elm Public Library].
 
=== InteroperabilityInteroperabilità withcon HTML, CSS, ande JavaScript ===
 
Elm usesusa anun'astrazione abstractionchiamata called"porte" ports toper communicatecomunicare withcon [[JavaScript]].<ref>[http{{Cita web |url=https://elm-lang.org/learn/Ports.elm |titolo=Ports] |accesso=4 gennaio 2017 |urlarchivio=https://web.archive.org/web/20160313045712/http://elm-lang.org/learn/ports.elm |dataarchivio=13 marzo 2016 |urlmorto=sì }}</ref> ItConsente allowsai valuesvalori todi flowfluire indentro ande outfuori ofda programmi Elm programs, making it possiblerendendo topossibile communicatecomunicare betweenfra Elm ande JavaScript.
 
Elm hasha auna librarylibreria calledchiamata "elm-html", thatche ai programmerprogrammatori canpossono useusare toper writespecificare codice HTML ande CSS withindall'interno di Elm.<ref>[httphttps://package.elm-lang.org/packages/evancz/elm-html/latest/ elm-html documentation]</ref> ItUsa usesun aapproccio al [[virtual DOM virtuale]] approachper torendere makeefficienti updatesgli efficientaggiornamenti.<ref>[http{{Cita web |url=https://elm-lang.org/blog/Blazing-Fast-Html.elm |titolo=Blazing Fast Html] |accesso=1 maggio 2019 |urlarchivio=https://web.archive.org/web/20160313060056/http://elm-lang.org/blog/blazing-fast-html.elm |dataarchivio=13 marzo 2016 |urlmorto=sì }}</ref>
 
== LimitationsLimitazioni ==
Unlike [[Haskell (programming language)|Haskell]], Elm has no support for [[Kind (type theory)|higher-kinded types]], and thus cannot provide generic abstractions for many common operations.<ref>{{cite web|title=Higher-Kinded types Not Expressible? #396|url=https://github.com/elm-lang/elm-compiler/issues/396|website=github.com/elm-lang/elm-compiler|accessdate=6 March 2015}}</ref> For example, there is no generic <code>map</code>, <code>apply</code>, <code>fold</code>, or <code>filter</code> function. Instead, such names are used prefixed by their module, such as <code>List.map</code> and <code>Dict.map</code>.
 
Diversamente da Haskell, Elm non supporta i tipi di livello superiore, e quindi non può fornire astrazioni generiche per molte operazioni comuni.<ref>{{Cita web|titolo=Higher-Kinded types Not Expressible? #396|url=https://github.com/elm-lang/elm-compiler/issues/396|sito=github.com/elm-lang/elm-compiler|accesso=6 marzo 2015}}</ref> Per esempio, non ci sono funzioni generiche <code>map</code>, <code>apply</code>, <code>fold</code>, né <code>filter</code>. Invece, tali nomi si usano prefissi dal nome del modulo in cui sono definiti, come per <code>List.map</code> e <code>Dict.map</code>.
== Tools ==
* Online editor at [http://elm-lang.org/try elm-lang.org/try] for easy experimentation
* [https://github.com/elm-lang/elm-platform Elm Platform] for installing the core tools locally
* [http://debug.elm-lang.org/ Time-Traveling Debugger]
* [http://elm-lang.org/Learn.elm Learning resources] and [http://elm-lang.org/Examples.elm examples]
* [http://package.elm-lang.org/packages/elm-lang/core/latest/ Core Libraries] and [http://package.elm-lang.org/packages/ Community Libraries]
 
== Example codeStrumenti ==
<source lang="elm">
-- This is a single line comment
 
* Editor online [http://elm-lang.org/try elm-lang.org/try] per facili esperimenti
{- This is a multi-line comment.
* [https://ellie-app.com/new Ellie], un editor più avanzato con supporto all'aggiunta di librerie
It can span multiple lines.
* [https://guide.elm-lang.org/ La guida ufficiale] ed [http://elm-lang.org/examples esempi]
* [https://package.elm-lang.org/packages/elm/core/latest/ Libreria di base] e [http://package.elm-lang.org/packages/ librerie della comunità]
* [https://lydell.github.io/elm-watch elm-watch] per sviluppo con live reload
* [https://github.com/jfmengels/node-elm-review elm-review] per il linting
* [https://github.com/avh4/elm-format elm-format], il formattatore standard utilizzato dalla maggior parte degli utenti
 
== Codice di esempio ==
 
<syntaxhighlight lang="elm">
-- 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 -} -}
{- It is possible to {- nest -} multi-line comments -}
 
{--| HereQui wedefiniamo defineun avalore value namedchiamato ''greetingsaluti''. The typeIl istipo inferredviene asinferito aessere String.
 
greeting =
La pipe (|) all'inizio del commento indica che questa è documentazione per il valore che stiamo definendo.
 
-}
saluti =
"Hello World!"
 
-- It is best to add type annotations to top-level declarations.
hello : String
hello =
"Hi there."
 
{-| È meglio aggiungere annotazioni di tipo alle dichiarazioni di primo livello.
-- Functions are declared the same way, with arguments following the function name.
-}
add x y =
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
 
-- Again, it is best to add type annotations.
hypotenuse : Float -> Float -> Float
hypotenuse a b =
sqrt (a^2 + b^2)
 
{-| Ancora, è meglio aggiungere le annotazioni di tipo.
-- If-expressions are used to branch on values
-}
absoluteValue : Int -> Int
ipotenusa : Float -> Float -> Float
absoluteValue number =
ipotenusa a b =
if number < 0 then -number else number
sqrt (a ^ 2 + b ^ 2)
 
 
-- Records are used to hold values with named fields
valoreAssoluto : Int -> Int
book : { title:String, author:String, pages:Int }
valoreAssoluto numero =
book =
-- Le espressioni `if` si usano per fare diramazioni in base a valori
{ title = "Steppenwolf"
,if authornumero =< "Hesse"0 then
, pages = 237 -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
}
 
-- We can create entirely new types with the `type` keyword.
-- The following value represents a binary tree.
type Tree a
= Empty
| Node a (Tree a) (Tree a)
 
{-| Possiamo creare tipi completamente nuovi usando la parola-chiave `type`.
-- It is possible to inspect these types with case-expressions.
 
depth : Tree a -> Int
Il seguente valore rappresenta un albero binario.
depth tree =
 
case tree of
-}
Empty -> 0
type Albero a
Node value left right ->
= Vuoto
1 + max (depth left) (depth right)
| Nodo a (Albero a) (Albero a)
</source>
 
 
{-| È 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)
</syntaxhighlight>
 
==Note==
<references />
 
==Collegamenti esterni==
* {{Collegamenti esterni}}
 
{{Portale|informatica}}
== References ==
{{Reflist|2}}
 
[[Categoria:Linguaggi di programmazione funzionali]]
== External links ==
* {{Official website|elm-lang.org}}