Introdução ao Elixir Lang
Publicados: 2015-02-27Uma introdução à linguagem de programação Elixir (e por que eu a amo)
Eu escrevi um artigo há alguns meses apresentando Golang a você e por que eu amei tanto. Embora eu ainda ame, ultimamente tenho brincado com uma nova linguagem; Elixir. Comprei o livro Programming Elixir e estou acompanhando. Eu já passei a amar Elixir e espero mostrar o porquê neste artigo.
Enquanto eu trabalhava para o Couchbase alguns anos atrás, eu me interessei muito por Erlang e sistemas distribuídos. Para mim, Erlang é confuso. Quando vi Elixir, imediatamente soube que estava em algo bom. Elixir é detalhado como uma linguagem funcional e concorrente que roda sobre a VM Erlang.
Eu ouvi muitas vezes, pessoas dizendo que Elixir é 'Ruby para Erlang' etc. muitas das mesmas construções de programação. É, obviamente, semelhante em alguns aspectos ao Erlang, sendo construído sobre a Erlang VM e nos dando acesso direto às primitivas Erlang nativamente.
De qualquer forma, sem mais hesitação, vamos mergulhar e continuar com um pouco de Elixir.
Instalação
Se você estiver executando no OSX, a instalação é tão fácil quanto usar o Homebrew:
~ brew update
~ brew install erlang
~ brew install elixir
Depois de fazer isso, você deve ser capaz de executar:
~ elixir -v
> Elixir 1.0.2
Agora que o Elixir está instalado corretamente, podemos abrir um Elixir Interativo e brincar com alguns tipos básicos comuns.
Tipos de Elixir
Inicie um Interactive Elixir REPL digitando
> iex
Variáveis:
iex(1)> name = "rbin"
#=> "rbin"
Átomos:
No Elixir, um Atom é uma constante em que seu nome é seu próprio valor.
iex(2)> :this_is_an_atom
#=> :this_is_an_atom
iex(3)> :my_atom == :atom
#=> false
Tuplas:
Usamos a notação Curly Brace para definir Tuplas. No Elixir, as Tuplas são armazenadas imediatamente na memória, o que significa que obter o tamanho de uma Tupla ou acessar um elemento de Tupla é rápido, mas atualizar ou adicionar elementos é caro, pois requer a cópia de toda a tupla na memória.
iex(4)> tuple = {:hello, "world"}
#=> {:hello, "world"}
iex(5)> elem(tuple, 1)
#=> "world"
Listas:
No Elixir, as listas são armazenadas na memória, como listas vinculadas. Podemos atualizar listas trivialmente acrescentando elementos, mas anexar elementos é mais caro, pois precisamos percorrer toda a lista para descobrir seu tamanho.
iex(8)> list = [1, 2, :atom]
#=> [1, 2, :atom]
iex(9)> ["string"] ++ list
#=> ["string", 1, 2, :atom]
iex(10)> list ++ [31]
#=> [1, 2, :atom, 31]
Existem funções embutidas muito úteis para serem usadas com listas, incluindo obter o Head & Tail de uma lista.
iex(11)> hd(list)
#=> 1
iex(12)> tl(list)
#=> [2, :atom]
Funções anônimas:
No Elixir, as funções são cidadãos de primeira classe, o que significa que podemos passar funções como argumentos para outras funções. Abaixo, definiremos uma variável chamada add que contém uma função, que passaremos como argumento para a função is_function/1 .
iex(14)> add = fn a, b -> a + b end
#Function<12.90072148/2 in :erl_eval.expr/5>
iex(15)> add.(13, 31)
#=> 44
iex(16)> is_function(add)
#=> true
Organizando Nossos Projetos (Mix)
Elixir vem com uma ferramenta super útil chamada Mix. Mix é uma ferramenta de construção que nos permite gerar, organizar, compilar e testar nossos projetos com muita facilidade. Também facilita o gerenciamento de dependências. (Sempre um assunto delicado!) Para criar um novo projeto com o Mix, basta fazer o seguinte:
~ mix new myapp --module MyApp
Isso criará um diretório chamado myapp com alguns arquivos dentro. Ele também definirá um módulo MyApp dentro de lib/myapp.ex .
* creating README.md
* creating .gitignore
* creating mix.exs
* creating config
* creating config/config.exs
* creating lib
* creating lib/myapp.ex
* creating test
* creating test/test_helper.exs
* creating test/myapp_test.exs
Your mix project was created successfully.
You can use mix to compile it, test it, and more:
cd myapp
mix test
Como podemos ver, obtemos todos os arquivos necessários para uma estrutura básica do projeto. Eu acho que este é um dos recursos mais agradáveis disponíveis que acompanham o Elixir. Ter ferramentas de gerenciamento de projetos é super útil e economiza muito tempo.
O arquivo mix.exs é o arquivo principal usado para configurar nosso projeto, e gerenciar dependências etc. Obtemos um test/folder , no qual podemos escrever testes muito parecidos com ruby para nosso projeto. É claro que obtemos uma lib/folder , que contém os arquivos de origem do nosso projeto. Se executarmos o teste de mistura em nosso aplicativo, obteremos o seguinte:
$ mix test
Compiled lib/myapp.ex
Generated myapp.app
.
Finished in 0.04 seconds (0.04s on load, 0.00s on tests)
1 tests, 0 failures
Randomized with seed 543313
Simultaneidade
Assim como Erlang, Elixir usa o modelo 'Actor' para simultaneidade. Todo o nosso código é executado dentro de Processes e esses processos são isolados uns dos outros. Podemos fazer programas totalmente simultâneos no Elixir gerando Processos e enviando e recebendo mensagens entre eles.
No Elixir, iniciamos os processos usando a função spawn , que recebe outra função como argumento.
iex(1)> spawn(fn -> IO.puts 1 + 1 end)
#=> 2
#PID<0.55.0>
Como você pode ver, geramos um processo que gerou 1 + 1 e também retornou o ID do processo. Retornar esse ID do processo é útil, pois podemos atribuí-lo a uma variável e usá-lo para enviar mensagens ao processo. Antes de fazermos isso, precisamos criar um mecanismo de recebimento para obter as mensagens que enviamos para o processo. (Podemos ir em frente e fazer isso em nossa sessão de Elixir Interativo , linha por linha.)
Depois de fazer isso, podemos criar um processo que avalia area_loop e atribuí-lo a pid .
pid = spawn(fn -> Geometry.area_loop() end)
#=> #PID<0.40.0>
Podemos então enviar mensagens para o pid que nosso código predefinido irá corresponder, dependendo se ele recebe o átomo :rectangle ou o átomo :circle .
send pid, {:rectangle, 2, 3}
#=> Area = 6
# {:rectangle,2,3}
send pid, {:circle, 2}
#=> Area = 12.56000000000000049738
# {:circle,2}
Podemos verificar se os processos ainda estão em execução usando o método Process.alive? função.
Process.alive?(pid)
#=> false
Conclusão
Nós nem arranhamos a superfície neste blog. Há tantos recursos incríveis no Elixir, espero que você vá conferir por si mesmo. Listei alguns recursos de aprendizado abaixo para ajudá-lo ao longo do caminho, mas antes de sair e mergulhar, aqui estão algumas das minhas coisas favoritas sobre o Elixir:
- Era fácil de entender, com uma sintaxe semelhante a Ruby e primitivos semelhantes a Erlang
- Tem uma comunidade fantástica por trás disso
- Seu modelo de simultaneidade é familiar para mim e muito poderoso
- Mix é uma dádiva de Deus e economiza MUITO tempo
- Elixir nos encoraja a documentar tudo
- Torna a criação de aplicativos distribuídos um campo de batalha muito menos confuso
- Eu posso ver Elixir indo longe.
Recursos
Alguns recursos que achei muito úteis no meu curto tempo aprendendo Elixir:
- http://elixir-lang.org/getting-started/introduction.html
- https://pragprog.com/book/elixir/programming-elixir
- https://teamgaslight.com/blog/the-best-resources-for-learning-elixir
- http://exercism.io
* Vá em frente e saboreie esse Elixir! – @rbin*