Skip to content

Instantly share code, notes, and snippets.

@luizamboni
Created May 26, 2017 17:13
Show Gist options
  • Save luizamboni/8098093078f7068dc8e1e35f84857737 to your computer and use it in GitHub Desktop.
Save luizamboni/8098093078f7068dc8e1e35f84857737 to your computer and use it in GitHub Desktop.
Elixir Presentation

Elixir Lang

Características

  • 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

Alguns pontos em relação ao erlang

Mutabilidade de variáveis

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()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment