Elixir metaprogramming

Elixir metaprogramming

8e961e9ffb92825bd46bc6aedcea2f96?s=128

Felipe Renan

November 29, 2018
Tweet

Transcript

  1. Carregando…

  2. Felipe Renan feliperenan @feeliperenan

  3. None
  4. Elixir Metaprogramming

  5. O que é metaprogramação?

  6. “Metaprogramação é a programação de programas que escrevem ou manipulam

    outros programas…”
  7. https://pt.wikipedia.org/ “Metaprogramação é a programação de programas que escrevem ou

    manipulam outros programas…”
  8. Metaprogramação é código que gera código.

  9. Elixir é escrito em Elixir.

  10. Abstract Syntax Tree (AST) &
 Macros

  11. 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.
  12. 1 + 2 * 3

  13. + 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.
  14. + 1 * 2, 3

  15. + 1 * 2, 3 Func Func

  16. + 1 * 2, 3 Args Args

  17. +(1, *(2, 3))

  18. {func, metadata, args}

  19. iex> quote do: 2 * 3 {:*, _, [2, 3]}

  20. iex> quote do: 2 * 3 {:*, _, [2, 3]}

    ARGS Func
  21. iex> quote do: 1 + 2 * 3 {:+, ...,

    [1, {:*, ..., [2, 3]}]}
  22. {:+, ..., [1, {:*, ..., [2, 3]}]}

  23. {:+ 1, {:* 2, 3}} {:+, ..., [1, {:*, ...,

    [2, 3]}]}
  24. {:+ 1, {:* 2, 3}} +(1, *(2, 3)) {:+, ...,

    [1, {:*, ..., [2, 3]}]}
  25. Um pouco mais sobre quote…

  26. iex> name = "Felipe Renan" "Felipe Renan"

  27. iex> name = "Felipe Renan" "Felipe Renan" iex> "My name

    is name" "My name is name”
  28. 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”
  29. iex> quote do: 2 * 3 {:*, _, [2, 3]}

  30. iex> num = 1 1 iex> quote do: 2 *

    3 {:*, _, [2, 3]}
  31. iex> num = 1 1 iex> quote do: num
 {:num,

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

    iex> quote do: num
 {:num, [], Elixir} iex> quote do: 2 * 3 {:*, _, [2, 3]}
  33. iex> num = 1 1

  34. iex> quote do: 1 + num
 {:+, …, [1, {:num,

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

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

  37. iex> require Math iex> Math.say 1 + 2 1 +

    2 ------ 3
  38. None
  39. {:+, _, args}

  40. {:+, _, [2, 3]}

  41. None
  42. None
  43. iex> require Math iex> Math.say 1 + 2 1 +

    2 ------ 3
  44. Quase tudo são macros in Elixir.

  45. def & defmodule

  46. If & unless

  47. |>

  48. Macros Expansion

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

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

    ControlFlow.unless 1 != 1, do: "Entrou no bloco!!!” => “Entrou no bloco!!!”
  51. None
  52. None
  53. None
  54. ControlFlow.unless 1 == 1, do: "Entrou no bloco!!!”

  55. ControlFlow.unless 1 == 1, do: "Entrou no bloco!!!” if !1

    == 1, do: "Entrou no bloco!!!"
  56. 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
  57. 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.
  58. Macro rules

  59. * Não escreva macros 


  60. * Não escreva macros * Mas aprenda como elas funcionam


  61. Referências • https://pragprog.com/book/cmelixir/metaprogramming-elixir • Elixir in Elixir by Jay Hayes

    • Don’t write macros But do learn how they work - Jesse Anderson
  62. Obrigado :)