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

Elixir metaprogramming

Elixir metaprogramming

Avatar for Felipe Renan

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.