Elm (linguagem de programação)

Origem: Wikipédia, a enciclopédia livre.
Elm
Página oficial elm-lang.org

Elm é uma linguagem de programação específica de domínio para criar declarativamente interfaces gráficas com o usuário baseadas em navegador da web . Elm é puramente funcional e é desenvolvido com ênfase em usabilidade , desempenho e robustez . Ele anuncia "nenhuma exceção de tempo de execução na prática", [1] possibilitada pela verificação de tipo estático do compilador Elm.

História[editar | editar código-fonte]

Elm foi inicialmente projetado por Evan Czaplicki como sua tese em 2012. [2] O primeiro lançamento do Elm veio com muitos exemplos e um editor online que facilitou a experimentação em um navegador da web . [3] Evan Czaplicki ingressou na Prezi em 2013 para trabalhar na Elm, [4] e em 2016 mudou para a NoRedInk como Engenheiro Open Source, também iniciando a Elm Software Foundation. [5]

A implementação inicial do compilador Elm é direcionada para HTML , CSS e JavaScript . [6] O conjunto de ferramentas principais continuou a se expandir, agora incluindo um REPL, [7] gerenciador de pacotes, [8] depurador de viagem no tempo, [9] e instaladores para Mac e Windows. [10] Elm também tem um ecossistema de bibliotecas criadas pela comunidade [11] e um editor on-line avançado que permite trabalhos salvos e inclusão de bibliotecas comunitárias. [12]

Características[editar | editar código-fonte]

Elm tem um pequeno mas expressivo conjunto de construções de linguagem, incluindo expressões tradicionais, expressões de expressões para estados locais e expressões de casos para correspondência de padrões . [13] Como linguagem funcional, suporta funções anônimas, funções como argumentos e aplicação parcial (currying) por padrão. Sua semântica inclui valores imutáveis, funções stateless e tipagem estática com inferência de tipos. Programas Elm renderizam HTML através de um DOM virtual e podem interoperar com outro código usando "JavaScript como um serviço".

Imutabilidade[editar | editar código-fonte]

Todos os valores em Elm são imutáveis , o que significa que um valor não pode ser modificado depois de criado. Elm usa estruturas de dados persistentes para implementar suas bibliotecas Array , Dict e Set . [14]

Tipos estáticos[editar | editar código-fonte]

Elm é estaticamente digitado. As anotações de tipo são opcionais (devido à inferência de tipos), mas são fortemente incentivadas. As anotações existem na linha acima da definição (diferentemente das linguagens da família C, onde tipos e nomes são intercalados). Elm usa um único cólon para significar "tem tipo".

Os tipos incluem primitivos como inteiros e cadeias de caracteres e estruturas de dados básicas, como listas, tuplas e registros. As funções têm tipos escritos com setas, por exemplo, round  : Float -> Int . Os tipos de união permitem que o programador crie tipos personalizados para representar dados de uma maneira que corresponda ao domínio do problema. [15]

Tipos podem se referir a outros tipos, por exemplo, uma List Int . Tipos são sempre capitalizados; nomes de letras minúsculas são variáveis de tipo. Por exemplo, uma List a é uma lista de valores de tipo desconhecido. É o tipo da lista vazia e do argumento para List.length , que é agnóstico para os elementos da lista. Existem alguns tipos especiais que os programadores criam para interagir com o tempo de execução Elm. Por exemplo, Html Msg representa uma árvore DOM (virtual) cujos manipuladores de eventos produzem mensagens do tipo Msg .

Em vez de permitir que qualquer valor seja implicitamente anulável (como um ponteiro undefined ou nulo de um JavaScript), a biblioteca padrão de Elm define Maybe a tipo Maybe a . Código que produz ou manipula um valor opcional faz isso explicitamente usando esse tipo, e todo o outro código é garantido que um valor do tipo reivindicado está realmente presente.

Sistema de módulos[editar | editar código-fonte]

Elm tem um sistema de módulos que permite aos usuários quebrar o código em partes menores chamadas módulos. Os módulos podem ocultar detalhes de implementação, como funções auxiliares, e agrupar códigos relacionados. Os módulos servem como um namespace para código importado, como Bitwise.and . Bibliotecas de terceiros (ou pacotes) consistem em um ou mais módulos e estão disponíveis na Biblioteca Pública Elm . Todas as bibliotecas são versionadas de acordo com o semver , que é aplicado pelo compilador e outras ferramentas. Ou seja, remover uma função ou alterar seu tipo só pode ser feito em uma versão principal.

Interoperabilidade com HTML, CSS e JavaScript[editar | editar código-fonte]

Elm usa uma abstração chamada ports para se comunicar com JavaScript . [16] Ele permite que os valores entrem e saiam dos programas Elm, possibilitando a comunicação entre Elm e JavaScript.

Elm tem uma biblioteca chamada elm-html que um programador pode usar para escrever HTML e CSS dentro do Elm. [17] Ele usa uma abordagem DOM virtual para tornar as atualizações eficientes. [18]

Limitações[editar | editar código-fonte]

Ao contrário do Haskell ou do PureScript, o Elm não tem suporte para tipos mais sofisticados e, portanto, não pode fornecer abstrações genéricas para muitas operações comuns. [19] Por exemplo, não há uma função genérica de map , apply , fold ou filter . Em vez disso, esses nomes são usados como prefixo de seu módulo, como List.map e Dict.map .

Código de exemplo[editar | editar código-fonte]

-- Este é um comentário de apenas uma linha

{- Este é um comentário de várias linhas
   Bloco de comentário com várias linhas
-}

{- É possível agrupar múltiplas linhas -}

-- Aqui foi definido uma variável ''greeting'' do tipo String
greeting =
    "Hello World!"

 -- É melhor adicionar o tipo das anotações nas declarações ao topo
hello : String
hello =
    "Hi there."

-- Funções são declaradas da mesma forma e os argumentos seguem o nome padrão da função
add x y =
    x + y

-- Novamente o ideal é adicionar o tipo das anotações
hypotenuse : Float -> Float -> Float
hypotenuse a b =
    sqrt (a^2 + b^2)

-- Funções também manipulam vários argumentos de uma vez, aqui um caso da função de multiplicação
-- Operador infico com "2"
multiplyBy2 : number -> number
multiplyBy2 =
    (*) 2

-- Expressões if são usadas para desviar valores
absoluteValue : number -> number
absoluteValue number =
    if number < 0 then negate number else number

 -- Registros são usados para manter valores com campos nomeados
book : { title : String, author : String, pages : Int }
book =
    { title = "Steppenwolf"
    , author = "Hesse"
    , pages = 237
    }

-- Acesso de registro é feito com "."
title : String
title =
    book.title

-- Acesso de registro "." também pode ser usado como uma função
author : String
author =
    .author book

-- Podemos criar tipos novos com a palavra-chave "type"
-- O valor a seguir representa uma árvore binária
type Tree a
    = Empty
    | Node a (Tree a) (Tree a)

-- É possível inpecionar esses tipos com expressões "case"
depth : Tree a -> Int
depth tree =
    case tree of
        Empty ->
            0

        Node value left right ->
            1 + max (depth left) (depth right)

Ligações externas[editar | editar código-fonte]

Referências[editar | editar código-fonte]

  1. «Elm home page» 
  2. «Elm: Concurrent FRP for Functional GUIs» (PDF) 
  3. «Try Elm». elm-lang.org. Consultado em 17 de março de 2019. Arquivado do original em 21 de maio de 2017 
  4. «elm and prezi». elm-lang.org 
  5. «new adventures for elm». elm-lang.org 
  6. «elm-lang/elm-compiler». GitHub 
  7. «repl». elm-lang.org 
  8. «package manager». elm-lang.org 
  9. «Home». debug.elm-lang.org. Consultado em 17 de março de 2019. Arquivado do original em 3 de maio de 2017 
  10. «elm-lang/elm-platform». GitHub 
  11. «Elm Packages». package.elm-lang.org. Consultado em 17 de março de 2019. Arquivado do original em 11 de fevereiro de 2015 
  12. «Ellie, the Elm Live Editor» 
  13. «syntax». elm-lang.org 
  14. «core 5.1.1». package.elm-lang.org 
  15. «Model The Problem». Elm 
  16. «JavaScript · An Introduction to Elm». elm-lang.org. Consultado em 17 de março de 2019. Arquivado do original em 13 de março de 2016 
  17. «html 2.0.0». package.elm-lang.org 
  18. «blazing fast html». elm-lang.org 
  19. «Higher-Kinded types Not Expressible? #396». github.com/elm-lang/elm-compiler