Elm (programlingvo)

Elm estas funkcia lingvo de programado kiu eblas krei grafikajn interfacojn por iu ajn retejo kaj ankaŭ ludojn. Ĝi transigas la kodon en ĜavaSkripto. La funkcieco de lingvoprogramado kiel Elm ebligas:

 Neniuj rultempaj eraroj praktike.
 Amikaj erarmesaĝoj.
 Fidinda redesignado.
 Aŭtomate devigita semantika versio por ĉiuj Elm-pakaĵoj.
alternative=Elm-bildeto|eta|

 Historio 

Elm kreitis de Evan Czaplicki en 2012Evan Czaplicki's thesis on Elm. La unua versio de Elm aperis kun iuj ekzemploj kaj interreta redaktilo, por testi la lingvonElm's Online Editor. Evan Czaplicki aliĝis Prezi en 2013 por prilabori la lingvon ElmElm joins Prezi, kaj en 2016, li kreis la fondaĵon «Elm Software Foundation»New Adventures for Elm.

La unua versio de Elm celis HTML, CSS kaj ĜavaSkripto. Iloj pliboniĝis dum la jaroj, kun nun REPLElm REPL announcement, paka mastrumiloElm Package Manager announcement, tempovojaĝanta erarserĉiloTime travel made easy kaj ankaŭ instaliloj por Vindozo kaj MakElm Platform. Ankaŭ vi povas instali Elm linuksen.

 Karakterizaĵoj 

Elm havas malmultajn lingvajn strukturojn sed ĉi tiuj estas tre esprimoplenaj : if, let, case, nenomitaj funkcioj  kaj listojThe Syntax of Elm. Ĝiaj precipaj karakterizaĵoj estas : abonoj, neŝanĝebleco, statika tipo kaj kunfunkciebleco kun HTML, CSS kaj ĜavaSkripto.

 Abonoj 

Grava ebleco de la karakterizavĵoj de Elm, estas la abono de funkcio al evento:

import Html exposing (Html)
import Browser
import Svg exposing (..)
import Svg.Attributes exposing (..)
import Time
import String

main =
  Browser.element
    { init = init
    , view = view
    , update = update
    , subscriptions = subscriptions
    }

type alias Model = Time.Posix

init : () -> (Model, Cmd Msg)
init _ =
  (Time.millisToPosix 0, Cmd.none)

type Msg
  = Tick Time.Posix

update : Msg -> Model -> (Model, Cmd Msg)
update action model =
  case action of
    Tick newTime ->
      (newTime, Cmd.none)

subscriptions : Model -> Sub Msg
subscriptions model =
  Time.every 1000 Tick

view : Model -> Html Msg
view model =
  let
    angle =
      degrees <| 6 * toFloat (Time.toSecond Time.utc model)

    handX =
      String.fromFloat (50 + 40 * cos angle)

    handY =
      String.fromFloat (50 + 40 * sin angle)
  in
    svg [ viewBox "0 0 100 100", width "300px" ]
      [ circle [ cx "50", cy "50", r "45", fill "#0B79CE" ] []
      , line [ x1 "50", y1 "50", x2 handX, y2 handY, stroke "#023963" ] []
      ]

 Neŝanĝebleco 

Ĉiuj valoroj neŝanĝeblecas, tiu signifas ke valoro ne povos ŝanĝigota post ĝia kreitaĵo.

 Statika tipo 

Elm uzas statikan tipsistemon.

 Moduloj 

Elm uzas modulojn kiujn vi povas instali per paka mastrumilo.

 Kunfunkciebleco kun HTML, CSS kaj ĜavaSkripto 

Elm uzas abstraktecon nomitan port por komuniki kun ĜavaSkripto.

 Ekzempla kodo 

-- Komenta linio

{- Ĉi tio estas plurlinia komento.
   Ĝi povas daŭri laŭ pluraj linioj.
-}

{- Eblas {- imbriki -} plurliniajn komentojn -}

-- Difinas valoron nomitan «saluto». La deduktita tipo estas kiel «String» (Ĉeno de signoj) 
saluto =
    "Saluton al ĉiuj!"

-- Pli bone estas aldoni tipan komentadon por supraj nivelaj deklaroj.
saluton : String
saluton =
    "Saluton."

-- Funkcioj kreitas same, kun siaj argumentoj malantaŭe la funkcia nomo. 
plus x y =
    x + y

-- Estas ankaŭ pli bone komenti la tipojn de la funkcioj.
hypotenuzo : Float -> Float -> Float
hypotenuzo a b =
    sqrt (a^2 + b^2)

-- «if» estas esprimo kiu redonas valoron.
absolutValoro : Int -> Int
absolutValoro numero =
    if numero < 0 then -numero else numero

-- La registradoj uzitas por kunmeti nomitajn valorojn.
libro : { titolo:String, aŭtoro:String, pagoj:Int }
libro =
    { titolo = "Steppenwolf"
    , aŭtoro = "Hesse"
    , paĝoj = 237 
    }

-- Eblas krei novan tipon per ŝlosvorto «type».
-- La sekvanto reprezentas duuman arbon.
type Arbo a
    = Malpleno
    | Nodo a (Arbo a) (Arbo a)

-- Eblas inspekti tipojn kun esprimo «case».
profundoDe : Arbo a -> Int
profundoDe arbo =
    case arbo of
      Malpleno -> 0
      Nodo valoro maldekstro dekstro ->
          1 + max (profundoDe maldekstro) (profundoDe dekstro)

 Referencoj 

Kategorio:Programlingvoj
Kategorio:Funkciaj programlingvoj