Elixir metaprogramming

26
Metaprogramming in Elixir A brief introduction

Transcript of Elixir metaprogramming

Page 1: Elixir metaprogramming

Metaprogramming in ElixirA brief introduction

Page 2: Elixir metaprogramming

What will be about?

macros quote and unquote DSLs a.k.a. __using__

Page 3: Elixir metaprogramming

Rules regarding macrosMACRO RULE #1

DON'T WRITE MACROS

MACRO RULE #2

USE MACROS GRATUITOUSLY

Page 4: Elixir metaprogramming

What are macros?A code that writes code

Page 5: Elixir metaprogramming

Where are macros?

Elixir itself is primarily built with macros

ifunless

cond

def defmodule

assert

Page 6: Elixir metaprogramming

How do macros work?

Page 7: Elixir metaprogramming

https://github.com/elixir-lang/elixir/blob/master/lib/elixir/lib/kernel.ex

Page 8: Elixir metaprogramming
Page 9: Elixir metaprogramming
Page 10: Elixir metaprogramming
Page 11: Elixir metaprogramming

Macro expanding

Page 12: Elixir metaprogramming

What can macros do?

Page 13: Elixir metaprogramming

Why to use macros?

Extending the language to your needs

Boilerplate removal

Page 14: Elixir metaprogramming

ASTs

Page 15: Elixir metaprogramming

quote

iex(1)> quote do: 1 + 2 {:+, [context: Elixir, import: Kernel], [1, 2]}

Always an atom or another tupleMetadata

The arguments for the function call

Page 16: Elixir metaprogramming

unquote

iex(2)> Macro.to_string { ...(2)> :div, ...(2)> [context: Elixir, import: Kernel], ...(2)> [10, 2] ...(2)> } "div(10, 2)"

iex(1)> quote do: div(10, 2) { :div, [context: Elixir, import: Kernel], [10, 2] }

Page 17: Elixir metaprogramming
Page 18: Elixir metaprogramming

__using__

Page 19: Elixir metaprogramming
Page 20: Elixir metaprogramming

Custom type

Page 21: Elixir metaprogramming

DB migration

Page 22: Elixir metaprogramming

Model

Page 23: Elixir metaprogramming

Operations

Page 24: Elixir metaprogramming

KamilLelonek / exnumerator

Page 25: Elixir metaprogramming

Learning materials

http://bit.ly/elixir-metaprogramminghttp://bit.ly/elixir-macros

Page 26: Elixir metaprogramming

https://github.com/KamilLelonek/exnumerator

https://blog.lelonek.me/

http://woumedia.com/

https://twitter.com/KamilLelonek