$30 off During Our Annual Pro Sale. View Details »

Hello Elixir, entrando na Linguagem Funcional!

Hello Elixir, entrando na Linguagem Funcional!

Imersão sobre o Elixir, linguagem funcional, saindo fora da caixa conforme definiu o nosso amigo Alex Ferreira -https://br.linkedin.com/in/alexsferreira/pt

Opensanca

March 19, 2016
Tweet

More Decks by Opensanca

Other Decks in Programming

Transcript

  1. elixir O que existe atrás do mistério

  2. Email: alex@dsol.com.br Github: /alexferreira FullStack developer, NodeJs, Elixir, Ruby, EmberJs,

    Sass, Stylus, Fotografo nas horas vagas. Quem sou eu
  3. None
  4. Linguagem de programação criada em 1986 e ja está no

    mercado a 30 anos.
  5. Usado por

  6. AXD-301

  7. AXD-301 Disponibilidade 99.9999999% Offline 0.6 segundos em 20 anos

  8. Guerra dos mundos • Eficiência e confiabilidade • Programação Concorrente

    • Tolerante a falhas • Suporte à programação de sistemas distribuídos Sistemas Distribuídos
  9. Guerra dos mundos • Eficiência e confiabilidade • Programação Concorrente

    • Tolerante a falhas • Suporte à programação de sistemas distribuídos Sistemas Distribuídos
  10. Guerra dos mundos • Eficiência e confiabilidade • Programação Concorrente

    • Tolerante a falhas • Suporte à programação de sistemas distribuídos Sistemas Distribuídos
  11. Guerra dos mundos • Eficiência e confiabilidade • Programação Concorrente

    • Tolerante a falhas • Suporte à programação de sistemas distribuídos • Fácil Prototipação • Fácil Manutenção • Fácil Evolução Sistemas Distribuídos Aplicações Web
  12. Guerra dos mundos • Eficiência e confiabilidade • Programação Concorrente

    • Tolerante a falhas • Suporte à programação de sistemas distribuídos • Fácil Prototipação • Fácil Manutenção • Fácil Evolução Sistemas Distribuídos Aplicações Web
  13. Guerra dos mundos • Eficiência e confiabilidade • Programação Concorrente

    • Tolerante a falhas • Suporte à programação de sistemas distribuídos • Fácil Prototipação • Fácil Manutenção • Fácil Evolução Sistemas Distribuídos Aplicações Web
  14. Guerra dos mundos • Eficiência e confiabilidade • Programação Concorrente

    • Tolerante a falhas • Suporte à programação de sistemas distribuídos • Fácil Prototipação • Fácil Manutenção • Fácil Evolução Sistemas Distribuídos Aplicações Web
  15. Guerra dos mundos • Eficiência e confiabilidade • Programação Concorrente

    • Tolerante a falhas • Suporte à programação de sistemas distribuídos • Fácil Prototipação • Fácil Manutenção • Fácil Evolução Sistemas Distribuídos Aplicações Web
  16. Guerra dos mundos • Eficiência e confiabilidade • Programação Concorrente

    • Tolerante a falhas • Suporte à programação de sistemas distribuídos • Fácil Prototipação • Fácil Manutenção • Fácil Evolução Sistemas Distribuídos Aplicações Web ?
  17. Que faça-se a luz • Eficiência e confiabilidade • Programação

    Concorrente • Tolerante a falhas • Suporte à programação de sistemas distribuídos • Fácil Prototipação • Fácil Manutenção • Fácil Evolução
  18. Que faça-se a luz • Eficiência e confiabilidade • Programação

    Concorrente • Tolerante a falhas • Suporte à programação de sistemas distribuídos • Fácil Prototipação • Fácil Manutenção • Fácil Evolução
  19. Porque ELIXIR?

  20. Porque ELIXIR? ”Eu gostei de tudo que vi em Erlang,

    mas eu odiava as coisas que eu não vi” José Valim
  21. Porque ELIXIR? Semântica, Eficiência, Confiabilidade ”Eu gostei de tudo que

    vi em Erlang, mas eu odiava as coisas que eu não vi” José Valim
  22. Porque ELIXIR? Semântica, Eficiência, Confiabilidade Facilidade do Ruby e Experiência

    ”Eu gostei de tudo que vi em Erlang, mas eu odiava as coisas que eu não vi” José Valim
  23. Porque ELIXIR? Semântica, Eficiência, Confiabilidade Ferramentas e Modularidade Facilidade do

    Ruby e Experiência ”Eu gostei de tudo que vi em Erlang, mas eu odiava as coisas que eu não vi” José Valim
  24. Porque ELIXIR? Semântica, Eficiência, Confiabilidade Ferramentas e Modularidade Facilidade do

    Ruby e Experiência ”Eu gostei de tudo que vi em Erlang, mas eu odiava as coisas que eu não vi” José Valim Macros
  25. Elixir é uma linguagem dinâmica e funcional projetada para construir

    aplicações escaláveis e de fácil manutenção.
  26. Comparativo 1 2 3 4 5 -module(hello_world). -compile(export_all). say_hello(Name) →

    io:print(“Hello ~p~n”, [Name]). Há quem diga que o problema é a linguagem ser funcional, outros que reclamam do suporte a testes, outros da nomenclatura utilizada, outros da falta de ferramentas e etc.
  27. Comparativo 1 2 3 4 5 defmodule HelloWorld do def

    say_hello(name) do IO.puts “Hello #{name}” end end A estrutura é simples e muito familiar para quem já lê código Ruby.
  28. Tipos Básicos

  29. Tipos Básicos Os tipos básicos do elixir são: integer, floats,

    booleans, atoms, strings, lists e tuples 1 #inteiro 0x1f #inteiro 1.0 #float True #boolean :atom #atom / symbol ”elixir” #string [9,8,7,6] #list {5,6,7,8} #tuple
  30. Tipos Básicos - Inteiros Elixir também suporta a conversão de

    números binários, octais e hexadecimais para inteiros:
  31. Tipos Básicos - Float O pontos flutuantes necessitam de um

    ponto, seguindo por, pelo menos um dígito; estes possuem uma precisão de 64 bits e suportam e para números exponenciais.
  32. Tipos Básicos - Float Você pode chamar a função round

    para obter o número inteiro mais próximo, ou a função trunc para obter a parte inteira de um float.
  33. Tipos Básicos – Booleans Elixir suporta true e false como

    valores booleanos; todo valor é verdadeiro com excessão de false e nil:
  34. Tipos Básicos – Atoms Átomos são constantes, onde seu nome

    é o seu próprio valor. Algumas outras linguagens chamam estes símbolos:
  35. Tipos Básicos – Atoms Valores booleanos true e false, são

    de fato atoms:
  36. Tipos Básicos - String As strings em Elixir são codificadas

    em utf-8 e são representadas com aspas duplas, suporta quebras de linhas, caracteres de escape e interpolação.
  37. Tipos Básicos - Lists As listas são simples coleções de

    valores, elas podem incluir múltiplos tipos; listas podem incluir valores não-exclusivos: Elixir implementa listas como listas encadeadas. Isso significa que acessar a profundidade da lista é uma operação O(n).
  38. Tipos Básicos – Lists - Concatenando e Subtraindo A concatenação

    de listas usa o operador ++/2 O suportare para subtração é provido pelo operador --/2. É seguro subtrair um valor que não existe, isso não retorna um erro.
  39. Tipos Básicos – Lists – Cabeça e Cauda Quando usamos

    listas é comum trabalhar com a cabeça e a cauda da lista. O Elixir provê funções úteis para trabalhar com essas partes, são elas hd e tl A cabeça é o primeiro elemento da lista e a cauda são os elementos restantes.
  40. Tipos Básicos – Lists – Cabeça e Cauda Vamos atribuir

    uma lista para uma variável e recuperar a sua cabeça e a cauda:
  41. Tipos Básicos – Lists – Cabeça e Cauda Além das

    funções citadas, podemos utilizar o o operador pipe |;
  42. Tipos Básicos – Tuples O Elixir usa chaves para definir

    tuples, assim como as listas as tuples podem conter qualquer valor.
  43. Tipos Básicos – Tuples As tuples são armazenadas de forma

    contígua na memória. Permitindo o acesso a sua profundidade de forma rápida.
  44. Tipos Básicos – Tuples Também é possível modificar um elemento

    em um índice especifico usando a função put_elem
  45. Operações Básicas

  46. Operações Básicas - Aritmética Elixir suporta os operadores básicos +,

    -, * e / como era de se esperar.
  47. Operações Básicas – Aritmética

  48. Estruturas de Controle de fluxo

  49. Controle de Fluxo – case O case nos permite comparar

    um valor contra muitos padrões até encontrarmos um que corresponda
  50. Controle de Fluxo – case O uso da variável _

    é uma importante inclusão na declaração do case.
  51. Controle de Fluxo – case Considere o _ como o

    else que irá igualar com todo o resto
  52. Controle de Fluxo – case Se você pretende encontrar correspondência

    em variáveis existentes, você precisará do operador ^
  53. Controle de Fluxo – case Outra característica interessante do case

    é o seu suporte a cláusulas de guarda
  54. Controle de Fluxo – cond Em muitas circunstâncias, queremos verificar

    condições diferentes e encontrar o primeiro resultado correspondente. Em tais casos recorremos ao cond
  55. Controle de Fluxo – cond Se nenhuma das condições corresponder

    será gerado um erro assim como no case. Por esta razão, pode ser necessário adicionar uma condição final
  56. Controle de Fluxo – if e unless No Elixir o

    if e unless são definidos como macros, não construtores de linguagem.
  57. Controle de Fluxo – if e unless O unless é

    bem parecido ao uso do if porém trabalhando de forma negativa
  58. Modulo

  59. Módulos – Funções Nomeadas Dentro de um módulo, podemos definir

    funcões com def e funções privadas com defp.
  60. Módulos – Funções Nomeadas Função reduzida

  61. Módulos – Funções Nomeadas Função privada

  62. Módulos – Funções Nomeadas Usando cláusulas de guarda

  63. Módulos – Funções Nomeadas Argumentos padrões

  64. Funcões anonimas e abreviadas

  65. Funções anônimas e abreviadas

  66. Conhecendo o MIX

  67. Conhecendo o MIX Se você estiver familiarizado com Ryby, o

    mix é o Bundler, RubyGems e o Rake juntos.
  68. Conhecendo o MIX – Criando novos projetos O mix faz

    com que a crianção do projeto seja facil utilizando o comando mix new
  69. Conhecendo o MIX – Criando novos projetos

  70. Conhecendo o MIX – Gegenciando Dependencias Uma vez que definimos

    nossas dependencias Usaremos o comando abaixo para instalar as dependencias.
  71. Exercícios

  72. Exercicio – Fatorial Criar modulo Factorial, contendo o método of

  73. Exercicio – Somando Lista Criar modulo MyList, com métodos sum

    • Deverá passar uma lista para o método do modulo retornando o valor total
  74. Exercício – Sequencia de Fibonacci Criar módulo Fibonacci, com métodos

    fib
  75. Exercicio – Calculadora Criar modulo Calculator, com método result. A

    calculadora deve executar as seguintes operações • Somar • Subtrair • Multiplicar • Dividir • Checar se a opração é valida • Deve-se utilizar o tuple para calcular, ex: {:soma, 1, 2}
  76. Exercicio – FizzBuzz Criar modulo FizzBuzz, com métodos parse e

    create • Números divisíveis por 3 devem ser substituidos por Fizz • Números divisíveis por 5 devem ser substituidos por Buzz • Números divisíveis por 3 e 5 devem ser substituidos por FizzBuzz
  77. Aprendendo mais

  78. Sintaxe agora não é mais desculpa! Nem o ferramental, nem

    a comunidade, nem a disponibilidade de bibliotecas e etc, etc, etc. Sejam Bem-vindos ao mundo dos alquimistas!
  79. Obrigado Email: alex@dsol.com.br Github: /alexferreira