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", possibilitada pela verificação de tipo estático do compilador Elm.

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

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

Características 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 . 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 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 .

Tipos estáticos 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.

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 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 Elm usa uma abstração chamada ports para se comunicar com JavaScript . 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. Ele usa uma abordagem DOM virtual para tornar as atualizações eficientes.

Limitações 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. 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 -- 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

Referências

Categoria:Software de 2012 Categoria:Linguagens de programação criadas em 2012 Categoria:Linguagens de programação funcionais Categoria:Linguagens de domínio específico