Do JavaScript ao Elixir — Parte 1

Raphael Santos
How Kovi Work
Published in
5 min readJan 4, 2021

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 e hex:

  • 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

--

--