Elm (linguaggio di programmazione): differenze tra le versioni
Contenuto cancellato Contenuto aggiunto
m Risolvo disambigua Haskell in Haskell (linguaggio) tramite popup |
m Bot: inserimento portale (via JWB) |
||
| (26 versioni intermedie di 17 utenti non mostrate) | |||
Riga 1:
{{Linguaggio di programmazione
|nome = Elm
|autore = [[Evan Czaplicki]]
|data = [[2012]]
|versione = 0.
|utilizzo = generazione pagine Web dinamiche
|paradigmi = [[programmazione funzionale]]
|tipizzazione = forte, statica, inferita
|estensione = .elm
|influenzato_da = [[Haskell (linguaggio)|Haskell]], [[Standard ML]], [[OCaml]], [[F Sharp
|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
}}
'''Elm''' è un [[linguaggio di programmazione]] ___domain-specific per creare
== Storia ==
Elm è stato progettato inizialmente da Evan Czaplicki come progetto di tesi nel 2012.
L'implementazione iniziale del compilatore Elm genera codice HTML, CSS, e JavaScript.
== 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.
=== 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
=== 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>{{
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
===
Elm
Elm
==
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>.
==
* Editor online [http://elm-lang.org/try elm-lang.org/try] per facili esperimenti
* [https://ellie-app.com/new Ellie], un editor più avanzato con supporto all'aggiunta di librerie
* [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 -} -}
{-
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
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)
</syntaxhighlight>
==Note==
<references />
==Collegamenti esterni==
* {{Collegamenti esterni}}
{{Portale|informatica}}
[[Categoria:Linguaggi di programmazione funzionali]]
| |||