Do JavaScript ao Elixir — Parte 1
Calma! O objetivo desse post não é fazer você abandonar o JavaScript e sim despertar seu interesse em aprender uma nova linguagem, no caso, o poderoso Elixir! Então nessa série de posts, vou apresentar algumas diferenças e semelhanças entre o Javascript e o Elixir na criação de aplicações, mais precisamente, uma Rest API.
O que é Elixir?
Criada em 2011, por um brasileiro, José Valim, o Elixir é uma linguagem de programação funcional, então para quem vem do JavaScript (ES6), esse paradigma já é um pouco mais familiar.
O Elixir é executado na máquina virtual do Erlang (Erlang VM) que disponibiliza para a linguagem todas as suas características como: ser uma aplicação distribuída, realtime e tolerante a falhas
Recomendo fortemente o episódio 48 do podcast Hipsters ponto tech, onde o próprio Valim conta a história da linguagem e qual problema ela veio resolver.
Por que aprender Elixir?
É uma linguagem que vem se popularizando muito nos últimos anos, tendo como usuários, grandes empresas de tecnologia: Stone, Globo.com, IFood, Adobe, SquareEnix, Pinterest, Discord e muito mais.
Com poucos comandos no terminal, é possível criar CRUDs completos, aumentando assim a produtividade do desenvolvedor.
E além das características herdadas do Erlang, o Elixir também se estende para suportar metaprogramação com macros e polimorfismo via protocolos.
Como começar a programar em Elixir?
Depois de baixar e instalar o Elixir pelo site elixir-lang.org/install.html abra seu terminal e digite o comando:
$ elixir -vErlang/OTP 23 [erts-11.1.1] [source] [64-bit] [smp:12:12] [ds:12:12:10] [async-threads:1] [hipe] [dtrace] Elixir 1.11.2 (compiled with Erlang/OTP 23)
Se apareceu essa mensagem, então deu bom na instalação.
Porém como nosso objetivo aqui é construir uma Rest API ao longo dessa série de posts, você também deve instalar o Phoenix Framework.
Digite no seu terminal:
mix archive.install hex phx_new 1.5.7
Agora é só começar a codar!!!
Mas antes, uma breve explicação sobre as ferramentas
IEx
,mix
ehex
:
- IEx (Elixir’s Interactive Shell) é o terminal interativo do Elixir, permite executar códigos, comandos e funções em tempo real de compilação.
Com o Elixir instalado, basta digitar no terminal:
$ IEx
Erlang/OTP 23 [erts-11.1.1] [source] [64-bit] [smp:12:12] [ds:12:12:10] [async-threads:1] [hipe] [dtrace]Interactive Elixir (1.11.2) - press Ctrl+C to exit (type h() ENTER for help)
iex(1)>
E assim que a mensagem acima aparecer, você pode executar comandos em Elixir direto no terminal.
- Mix é uma ferramenta de build, que fornece tarefas para criar, compilar e testar as aplicações em Elixir.
- Hex é um gerenciador de pacotes para o ecossistema da Erlang VM, qualquer linguagem que compila para rodar na Erlang VM, como Elixir e Erlang, pode ser usada para construir pacotes Hex. Você pode encontrar os pacotes no site https://hexdocs.pm/ assim como no https://www.npmjs.com/ você encontra pacotes JavaScript.
É possível também rodar scripts pelo IEx
:
- Crie um arquivo chamado
hello_world.iex
- Escreva a função
IO.puts("Hello, World!")
dentro do arquivo e salve-o - Depois execute o comando no terminal:
$ IEx hello_world.iexErlang/OTP 23 [erts-11.1.1] [source] [64-bit] [smp:12:12] [ds:12:12:10] [async-threads:1] [hipe] [dtrace]Hello, World!
Interactive Elixir (1.11.2) - press Ctrl+C to exit (type h() ENTER for help)
iex(1)>
Mas se você precisa rodar algum script que possui dependências de um projeto mix, precisa passar as opções -S mix
, como por exemplo:
$ IEx -S mix nome_do_arquivo.ex
Extensões de arquivos no Elixir
O Elixir nos permite utilizar arquivos com extensão .ex
e .exs
, que são arquivos compilados e arquivos de script, respectivamente.
Os arquivos .ex
são compilados e geram um .beam
que é o bytecode gerado pelo Elixir para que a Erlang VM consiga interpretá-lo.
Os arquivos .exs
são arquivos de script, que são interpretados em tempo de execução e não compilados, utilizado em arquivos de configurações e arquivos de testes.
Algumas comparações
Para te contextualizar mais com a linguagem trago-lhes algumas comparações de funções e códigos feitos em JavaScript e em Elixir (utilizando o Phoenix Framework).
Comandos CLI
Criando funções
- Em JavaScript:
function funcaoBraba() {
# Faça alguma coisa
}
- Em Elixir:
def funcaoBraba() do
# Faça alguma coisa
end
Iterando arrays
map()
em JavaScript:
var numbers = [1, 2, 3];var result = numbers.map(function(number){
return number*2
});console.log(result);> [ 2, 4, 6 ]
map()
em Elixir:
Enum.map([1, 2, 3], fn(number) -> number * 2 end)> [2, 4, 6]
filter()
em JavaScript:
var characters = [
{name: 'Rick', age: 70},
{name: 'Morty', age: 14},
{name: 'Summer', age: 17},
{name: 'Beth', age: 34}
];var charactersAdulthood = characters.filter(function(character){
return character.age >= 21;
});console.log(charactersAdulthood);> [ { name: 'Rick', age: 70 }, { name: 'Beth', age: 34 } ]
filter()
em Elixir:
characters = [
%{name: 'Rick', age: 70},
%{name: 'Morty', age: 14},
%{name: 'Summer', age: 17},
%{name: 'Beth', age: 34}
]Enum.filter(characters, fn(character) -> character.age >= 21 end)> [%{age: 70, name: 'Rick'}, %{age: 34, name: 'Beth'}]
reduce()
em JavaScript:
var numbers = [1, 2, 3, 4, 5];var sum = numbers.reduce(function(acc, number){
return number + acc;
}, 0);console.log(sum);> 15
reduce()
em Elixir:
Enum.reduce([1, 2, 3, 4, 5], fn(number, acc) -> number + acc end)> 15
Bônus: Capture Operator
O Elixir possui um recurso extremamente interessante e lindo chamado capture operator que é simbolizado pelo caracter &
, este recurso é usado para capturar e criar funções anônimas, um exemplo com a função map()
:
Enum.map([1, 2, 3], & &1 * 2) > [2, 4, 6]
O operador captura e transforma uma função em função anônima que pode receber argumentos ou ser argumento de outra função.
O&
é meio que igual a fn(x) -> end
E o&1
é o x
Se tiver(x,y)
Fica&1
e &2
por aí vai.
Então nesse map a cada iteração ele vai fazer um fn(x)-> x * 2 end
Eae, curtiu?
No próximo capitulo vamos dar inicio a nossa Rest API em Elixir utilizando o Phoenix Framework!
Abaixo deixo alguns links para se aprofundar ainda mais nessa fantástica linguagem:
- https://elixir-lang.org/
- https://elixirschool.com/pt/
- https://learnxinyminutes.com/docs/pt-br/elixir-pt/
- https://medium.com/building-kovi/come%C3%A7ando-testes-unit%C3%A1rios-em-elixir-ab7ef59da361
- https://medium.com/true-henrique/elixir-10-motivos-para-aprender-6cd4d6876f05
- https://dockyard.com/blog/2016/08/05/understand-capture-operator-in-elixir