Elm (langage)

Un article de Wikipédia, l'encyclopédie libre.
Sauter à la navigation Sauter à la recherche

Elm (langage)
Logo.

Date de première version 2012
Paradigme fonctionnel
Auteur Evan Czaplicki
Dernière version 0.19.1 (21 Octobre 2019)
Typage statique
Influencé par Haskell
Standard ML
OCaml
F SharpVoir et modifier les données sur Wikidata
Système d'exploitation Linux, Windows et Mac
Licence Licence BSDVoir et modifier les données sur Wikidata
Site web http://elm-lang.org/

Elm est un langage de programmation fonctionnel qui permet de créer des interfaces graphiques pour le web ainsi que des jeux. Il compile le code en JavaScript.

Historique[modifier | modifier le code]

Elm a été créé par Evan Czaplicki en 2012[1]. La première version d'Elm vient avec quelques exemples et un éditeur en ligne, pour tester le langage[2]. Evan Czaplicki rejoint Prezi en 2013 pour travailler sur Elm[3], et en 2016, il lance la fondation Elm Software Foundation[4].

L'implémentation initiale d'Elm cible HTML, CSS et Javascript. Les outils se sont étendus avec désormais un REPL[5], un gestionnaire de paquets[6], un « débogueur dans le temps »[7] ainsi qu'un installateur pour Windows et Mac[8].

Caractéristiques[modifier | modifier le code]

Elm possède peu de structures de langage mais celles-ci sont très expressives : if, let, case, fonctions anonymes et interpolation de listes[9],[10]. Ses principales caractéristiques sont : les souscriptions, l'immutabilité, le typage statique et l'interopérabilité avec HTML, CSS et JavaScript.

Souscriptions[modifier | modifier le code]

La grande abstraction d'Elm est appelée « Sub ». Il s'agit d'un évènement qui déclenche une fonction :

 1 import Html exposing (Html)
 2 import Html.App as Html
 3 import Svg exposing (..)
 4 import Svg.Attributes exposing (..)
 5 import Time exposing (Time, second)
 6 
 7 main =
 8   Html.program
 9     { init = init
10     , view = view
11     , update = update
12     , subscriptions = subscriptions
13     }
14 
15 type alias Model = Time
16 
17 init : (Model, Cmd Msg)
18 init =
19   (0, Cmd.none)
20 
21 type Msg
22   = Tick Time
23 
24 update : Msg -> Model -> (Model, Cmd Msg)
25 update action model =
26   case action of
27     Tick newTime ->
28       (newTime, Cmd.none)
29 
30 subscriptions : Model -> Sub Msg
31 subscriptions model =
32   Time.every second Tick
33 
34 view : Model -> Html Msg
35 view model =
36   let
37     angle =
38       turns (Time.inMinutes model)
39 
40     handX =
41       toString (50 + 40 * cos angle)
42 
43     handY =
44       toString (50 + 40 * sin angle)
45   in
46     svg [ viewBox "0 0 100 100", width "300px" ]
47       [ circle [ cx "50", cy "50", r "45", fill "#0B79CE" ] []
48       , line [ x1 "50", y1 "50", x2 handX, y2 handY, stroke "#023963" ] []
49       ]

Immutabilité[modifier | modifier le code]

Toutes les valeurs d'Elm sont immutables, cela signifie qu'une valeur ne peut pas changer après avoir été créée.

Typage statique[modifier | modifier le code]

Elm est statiquement typé.

Modules[modifier | modifier le code]

Elm fonctionne avec des modules.

Interopérabilité avec HTML, CSS et JavaScript[modifier | modifier le code]

Elm utilise une abstraction nommée port pour communiquer avec JavaScript.

Exemple de code[modifier | modifier le code]

 1 -- Commentaire sur une ligne
 2 
 3 {- Ceci est un commentaire multiligne.
 4    Il peut continuer sur plusieurs lignes.
 5 -}
 6 
 7 {- Il est possible {- d'imbriquer -} les commentaires multilignes -}
 8 
 9 -- Définition d'une valeur nommée « greeting ». Le type est inféré comme un « String ».
10 greeting =
11     "Hello World!"
12 
13 -- Il est préférable d'ajouter l'annotation des types pour les déclarations de haut-niveau.
14 hello : String
15 hello =
16     "Hi there."
17 
18 -- Les fonctions sont déclarées de la même façon, avec les arguments qui suivent le nom de la fonction.
19 add x y =
20     x + y
21 
22 -- Il est préférable d'annoter les types pour les fonctions aussi.
23 hypotenuse : Float -> Float -> Float
24 hypotenuse a b =
25     sqrt (a^2 + b^2)
26 
27 -- Le « if » est une expression : il retourne une valeur.
28 absoluteValue : Int -> Int
29 absoluteValue number =
30     if number < 0 then -number else number
31 
32 -- Les enregistrements sont utilisés pour grouper les valeurs avec des noms.
33 book : { title:String, author:String, pages:Int }
34 book =
35     { title = "Steppenwolf"
36     , author = "Hesse"
37     , pages = 237 
38     }
39 
40 -- Il est possible de créer un nouveau type avec le mot-clé « type ».
41 -- Ce qui suit représente un arbre binaire.
42 type Tree a
43     = Empty
44     | Node a (Tree a) (Tree a)
45 
46 -- Il est possible d'inspecter ces types avec une expression « case ».
47 depth : Tree a -> Int
48 depth tree =
49     case tree of
50       Empty -> 0
51       Node value left right ->
52           1 + max (depth left) (depth right)

Références[modifier | modifier le code]

Liens externes[modifier | modifier le code]