Elm (linguagem de programação)
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]- ↑ «Elm home page»
- ↑ «Elm: Concurrent FRP for Functional GUIs» (PDF)
- ↑ «Try Elm». elm-lang.org. Consultado em 17 de março de 2019. Arquivado do original em 21 de maio de 2017
- ↑ «elm and prezi». elm-lang.org
- ↑ «new adventures for elm». elm-lang.org
- ↑ «elm-lang/elm-compiler». GitHub
- ↑ «repl». elm-lang.org
- ↑ «package manager». elm-lang.org
- ↑ «Home». debug.elm-lang.org. Consultado em 17 de março de 2019. Arquivado do original em 3 de maio de 2017
- ↑ «elm-lang/elm-platform». GitHub
- ↑ «Elm Packages». package.elm-lang.org. Consultado em 17 de março de 2019. Arquivado do original em 11 de fevereiro de 2015
- ↑ «Ellie, the Elm Live Editor»
- ↑ «syntax». elm-lang.org
- ↑ «core 5.1.1». package.elm-lang.org
- ↑ «Model The Problem». Elm
- ↑ «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
- ↑ «html 2.0.0». package.elm-lang.org
- ↑ «blazing fast html». elm-lang.org
- ↑ «Higher-Kinded types Not Expressible? #396». github.com/elm-lang/elm-compiler