- funcional impura
- baseada no ecossistema de erlang (otp, beam vm, portabilidade de libs)
- sintaxe próxima ao Ruby (sintaxe do erlang é mais distinta) Ex: simbolos como "!", "||" tem função completamente diferente no erlang a igualdade é "=:=" por exemplo
- comunidade brasileira maior que do erlang
- fácil acesso a libs erlang
- automatizador de tarefas: Mix
- já vem com gerenciador de dependências por padrão (no Mix)
- variáveis mutáveis diferente do erlang
- tolerante a falhas
- ferramentas de depuração REPL (IEx.pry) e outros por padrão
Em elixir é possivel alterar variáveis
a = 1
a = 3
Ou não
a = 1
a^ = 3 # vai disparar um erro se "a" já estiver com algum valor
Em erlang não
A = 1
A = 2 # vai disparar um erro
Tanto em Elixir quanto em Erlang toda função retorna um valor, que é a última linha porém há algumas diferenças.
Em Erlang não há um valor defalt de retorno, então ele deve estar explicitamente funcão
is_valid_signal(Signal) ->
case Signal of
{signal, _What, _From, _To} ->
true;
{signal, _What, _To} ->
true;
_Else -> # qualquer outro padrão
false
end.
Em Elixir há um valor padrão, que é o 'nil' então se o case não cair em nenhum caso, o retorno da função is_valid_signal, será 'nil'
is_valid_signal(Signal) do
case Signal do
{signal, _What, _From, _To} ->
true;
{signal, _What, _To} ->
true;
end.
Em elixir é possível usar bibliotecas erlang simplesmente acessando as pelo atom, que as define?
:io.format("argumento = ~p~n",["argumento"])
Com elixir é possivel depurar o projeto com ferramentas REPL
require IEx;
defmodule Example do
def double_sum(x, y) do
IEx.pry
hard_work(x, y)
end
defp hard_work(x, y) do
2 * (x + y)
end
end
$ iex -S mix
Interactive Elixir (1.2.4) - press Ctrl+C to exit (type h() ENTER for help)
iex(1)> Example.double_sum(1, 2)
Em Elixir é possivel encadear funções com uso de pipes (pipe operator) facilitando a leitura, um recurso comum em linguagens funcionais
foo(bar(baz(new_function(other_function()))))
other_function() |> new_function() |> baz() |> bar() |> foo()