Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Elixir metaprogramming

Elixir metaprogramming

Felipe Renan

November 29, 2018
Tweet

More Decks by Felipe Renan

Other Decks in Programming

Transcript

  1. Abstract Syntax Tree (AST) Para quem não é familiar com

    AST, muitas linguagens de programação tem uma AST. Quando o nosso programa é compilado ou interpretado, o código que escrevemos é transformado em uma arvore antes de ser tornar bytecode ou machine code.
  2. + 1 * 2 3 Esse processo geralmente fica escondido

    da gente e geralmente nunca precisamos pensar sobre isso. Porém, em Elixir, esse processo fica exposto para o desenvolvedor.
  3. iex> quote do: 1 + 2 * 3 {:+, ...,

    [1, {:*, ..., [2, 3]}]}
  4. iex> name = "Felipe Renan" "Felipe Renan" iex> "My name

    is name" "My name is name” iex> "My name is #{name}” "My name is Felipe Renan”
  5. iex> num = 1 1 iex> quote do: num
 {:num,

    [], Elixir} iex> quote do: 2 * 3 {:*, _, [2, 3]}
  6. iex> num = 1 1 iex> quote do: unquote(num)
 1

    iex> quote do: num
 {:num, [], Elixir} iex> quote do: 2 * 3 {:*, _, [2, 3]}
  7. iex> quote do: 1 + num
 {:+, …, [1, {:num,

    [], Elixir}]} iex> num = 1 1
  8. iex> quote do: 1 + unquote(num)
 {:+, …, [1, 1]}

    iex> quote do: 1 + num
 {:+, …, [1, {:num, [], Elixir}]} iex> num = 1 1
  9. |>

  10. ControlFlow.unless 1 == 1, do: "Entrou no bloco!!!” => nil

    ControlFlow.unless 1 != 1, do: "Entrou no bloco!!!” => “Entrou no bloco!!!”
  11. ControlFlow.unless 1 == 1, do: "Entrou no bloco!!!” if !1

    == 1, do: "Entrou no bloco!!!" case !(1 == 1) do x when x in [false, nil] -> nil _ -> "block entered" end
  12. Kernel.SpecialForms As macros definidas aqui são blocos fundamentais no Elixir

    que não podem ser sobre-escritas. Elas também representam o fim da estrada das expansões das macros.