80
Elixir em um final de semana Pergunte-me como! @marcosbrizeno

Aprenda Elixir em um final de semana

Embed Size (px)

Citation preview

Page 1: Aprenda Elixir em um final de semana

Elixir em um final de semana

Pergunte-me como!

@marcosbrizeno

Page 2: Aprenda Elixir em um final de semana

Quem sou eu?@marcosbrizeno

brizeno.wordpress.com

Page 3: Aprenda Elixir em um final de semana

Como?O Simples Hello World!

Testes com ExUnit

Pattern Matching com Fibonacci

Tail Recursion com Cálculo Fatorial

O Operador |> (pipe)

Próximos finais de semana

Page 4: Aprenda Elixir em um final de semana

Por que Elixir?Porque sim Zequinha

Page 5: Aprenda Elixir em um final de semana

Elixir e Erlang

Funcional BR HUE!

Divertida e performática

BEAM VM

Elixir <- Erlang

Page 6: Aprenda Elixir em um final de semana

Hello World!

Page 7: Aprenda Elixir em um final de semana

$> iexiex(1)> IO.puts("Hello World!")Hello World!:ok

Page 8: Aprenda Elixir em um final de semana

$> iexiex(1)> IO.puts("Hello World!")Hello World!:ok

iex(1)> IO.puts("Hello World!")

Módulo IO

Função puts/1

Page 9: Aprenda Elixir em um final de semana

Criando módulos

Page 10: Aprenda Elixir em um final de semana

defmodule HelloWorld do def hello() do “Hello World” endend

hello_world.exs

Page 11: Aprenda Elixir em um final de semana

defmodule HelloWorld do def hello() do “Hello World” endend

hello_world.exsdefmodule HelloWorld do

end

Módulo HelloWorld

Page 12: Aprenda Elixir em um final de semana

defmodule HelloWorld do def hello() do “Hello World” endend

hello_world.exs

def hello() do “Hello World” end

Função hello/0

Page 13: Aprenda Elixir em um final de semana

defmodule HelloWorld do def hello() do “Hello World” endend

hello_world.exs

$> iexiex(1)> Code.load_file(“hello_world.exs")iex(2)> HelloWorld.hello()"Hello World"

Page 14: Aprenda Elixir em um final de semana

$> iexiex(1)> Code.load_file(“hello_world.exs")iex(2)> HelloWorld.hello()"Hello World"

iex(1)> Code.load_file(“hello_world.exs")iex(2)> HelloWorld.hello()

Carrega arquivo ”hello_world.exs”

Chama função hello/0

Page 15: Aprenda Elixir em um final de semana

Modificando módulos com hot reload

Page 16: Aprenda Elixir em um final de semana

defmodule HelloWorld do def hello() do “Hello World” end

def hello(name) do “Hello #{name}” endend

hello_world.exsdefmodule HelloWorld do

def hello(name) do “Hello #{name}” endend

Page 17: Aprenda Elixir em um final de semana

defmodule HelloWorld do def hello(name) do “Hello #{name}” endend

hello_world.exs

$> iexiex(1)> Code.load_file(“hello_world.exs")iex(2)> HelloWorld.hello()"Hello World”iex(3)> HelloWorld.hello(“Lambda I/O“)** (UndefinedFunctionError)

Page 18: Aprenda Elixir em um final de semana

$> iexiex(1)> Code.load_file(“hello_world.exs")iex(2)> HelloWorld.hello()"Hello World”iex(3)> HelloWorld.hello(“Lambda I/O“)** (UndefinedFunctionError)iex(4)> r(HelloWorld)iex(5)> HelloWorld.hello(“Lambda I/O“)"Hello Lambda I/O”

Page 19: Aprenda Elixir em um final de semana

$> iexiex(1)> Code.load_file(“hello_world.exs")iex(2)> HelloWorld.hello()"Hello World”iex(3)> HelloWorld.hello(“Lambda I/O“)** (UndefinedFunctionError)iex(4)> r(HelloWorld)iex(5)> HelloWorld.hello(“Lambda I/O“)"Hello Lambda I/O”

iex(4)> r(HelloWorld)iex(5)> HelloWorld.hello(“Lambda I/O“)"Hello Lambda I/O”

r Recarrega o módulo HelloWorld

Agora podemos acessar hello/1

Page 20: Aprenda Elixir em um final de semana

Testes com ExUnit

Page 21: Aprenda Elixir em um final de semana

defmodule HelloWorld do def hello() do “Hello World” end

def hello(name) do “Hello #{name}” endend

hello_world.exs

Page 22: Aprenda Elixir em um final de semana

hello_world_test.exsCode.load_file("hello_world.exs")

ExUnit.start

defmodule HelloWorldTest do use ExUnit.Case, async: true

test "returns Hello World" do assert HelloWorld.hello == "Hello World" endend

Page 23: Aprenda Elixir em um final de semana

$> elixir hello_world_test.exs.

Finished in 0.1 seconds (0.1s on load, 0.00s on tests)1 test, 0 failures

Page 24: Aprenda Elixir em um final de semana

Anatomia de um caso de test ExUnit

Page 25: Aprenda Elixir em um final de semana

hello_world_test.exsCode.load_file("hello_world.exs")

ExUnit.start

defmodule HelloWorldTest do use ExUnit.Case, async: true

test "returns Hello World" do assert HelloWorld.hello == "Hello World" endend

Code.load_file("hello_world.exs")

Page 26: Aprenda Elixir em um final de semana

hello_world_test.exsCode.load_file("hello_world.exs")

ExUnit.start

defmodule HelloWorldTest do use ExUnit.Case, async: true

test "returns Hello World" do assert HelloWorld.hello == "Hello World" endend

ExUnit.start

defmodule HelloWorldTest do use ExUnit.Case, async: true

end

Page 27: Aprenda Elixir em um final de semana

hello_world_test.exsCode.load_file("hello_world.exs")

ExUnit.start

defmodule HelloWorldTest do use ExUnit.Case, async: true

test "returns Hello World" do assert HelloWorld.hello == "Hello World" endend

test "returns Hello World" do assert HelloWorld.hello == "Hello World" end

Page 28: Aprenda Elixir em um final de semana

Saída em caso de falhas

Page 29: Aprenda Elixir em um final de semana

$> elixir hello_world_test.exs1) test returns Hello World (HelloWorldTest) hello_world_test.exs:8 Assertion with == failed code: HelloWorld.hello() == "Hello not World" left: "Hello World" right: "Hello not World" stacktrace: hello_world_test.exs:9: (test)

Page 30: Aprenda Elixir em um final de semana

Sequência Fibonacci com Pattern

Matching

Page 31: Aprenda Elixir em um final de semana

fib_test.exsCode.load_file("fib.exs")

ExUnit.start

defmodule FibonacciTest do use ExUnit.Case, async: true

test "fibonacci 0 is 0" do assert Fibonacci.calculate(0) == 0 endend

Page 32: Aprenda Elixir em um final de semana

fib.exsdefmodule Fibonacci do def calculate(number) do 0 endend

Page 33: Aprenda Elixir em um final de semana

$> elixir fib_test.exs.

Finished in 0.1 seconds (0.1s on load, 0.00s on tests)1 test, 0 failures

Page 34: Aprenda Elixir em um final de semana
Page 35: Aprenda Elixir em um final de semana

fib_test.exstest "fibonacci 0 is 0" do assert Fibonacci.calculate(0) == 0end

test "fibonacci 1 is 1" do assert Fibonacci.calculate(1) == 1end

test "fibonacci 2 is 1" do assert Fibonacci.calculate(2) == 1end

Page 36: Aprenda Elixir em um final de semana

fib.exsdef calculate(n) do cond do n <= 0 -> 0 n == 1 -> 1 true -> calculate(n-2) + calculate(n-1) endend

Page 37: Aprenda Elixir em um final de semana

$> elixir fib_test.exs...

Finished in 0.1 seconds (0.1s on load, 0.00s on tests)3 test, 0 failures

Page 38: Aprenda Elixir em um final de semana

Utilizando Pattern Matching

Page 39: Aprenda Elixir em um final de semana

fib.exs

def calculate(n) do case n do 0 -> 0 1 -> 1 _ -> calculate(n-2) + calculate(n-1) endend

Page 40: Aprenda Elixir em um final de semana

fib.exs

def calculate(n) do case n do 0 -> 0 1 -> 1 _ -> calculate(n-2) + calculate(n-1) endend

case n do 0 1 _ end

Page 41: Aprenda Elixir em um final de semana

$> elixir fib_test.exs...

Finished in 0.1 seconds (0.1s on load, 0.00s on tests)3 test, 0 failures

Page 42: Aprenda Elixir em um final de semana

Utilizando Pattern Matching nos argumentos

Page 43: Aprenda Elixir em um final de semana

fib.exs

def calculate(0), do: 0

def calculate(1), do: 1

def calculate(n) do calculate(n-2) + calculate(n-1)end

Page 44: Aprenda Elixir em um final de semana

$> elixir fib_test.exs...

Finished in 0.1 seconds (0.1s on load, 0.00s on tests)3 test, 0 failures

Page 45: Aprenda Elixir em um final de semana

Guard Clause nos métodos

Page 46: Aprenda Elixir em um final de semana

fib_test.exstest "raise ArgumentError" do assert_raise ArgumentError, fn -> Fibonacci.calculate(-1) endend

Page 47: Aprenda Elixir em um final de semana

fib.exsdef calculate(0), do: 0

def calculate(1), do: 1

def calculate(n) when n < 0 do raise ArgumentErrorend

def calculate(n) do calculate(n-2) + calculate(n-1)end

def calculate(n) when n < 0 do raise ArgumentErrorend

Page 48: Aprenda Elixir em um final de semana

Cálculo Fatorial com Tail Recursion

Page 49: Aprenda Elixir em um final de semana

factorial_test.exsCode.load_file("factorial.exs")

ExUnit.start

defmodule FactorialTest do use ExUnit.Case, async: true

test "factorial of 0 is 1" do assert Factorial.of(0) == 1 endend

Page 50: Aprenda Elixir em um final de semana

factorial.exsdefmodule Factorial do def of(0), do: 1end

Page 51: Aprenda Elixir em um final de semana

factorial_test.exstest "factorial of 1 is 1" do assert Factorial.of(1) == 1end

Page 52: Aprenda Elixir em um final de semana

factorial.exsdefmodule Factorial do def of(0), do: 1

def of(n) do of(n-1) * n endend

Page 53: Aprenda Elixir em um final de semana

Otimizando com Tail recursion

Page 54: Aprenda Elixir em um final de semana

factorial_test.exstest "factorial of 100000" do assert Factorial.of(100_000)end

@tag timeout: 600_000test "factorial of 500000" do assert Factorial.of(500_000)end

Page 55: Aprenda Elixir em um final de semana

factorial.exsdefmodule Factorial do def of(n), do: of(n, 1)

defp of(0, accumulator), do: accumulator

defp of(n, accumulator) do of(n-1, accumulator*n) endend

Page 56: Aprenda Elixir em um final de semana

factorial.exsdefmodule Factorial do def of(n), do: of(n, 1)

defp of(0, accumulator), do: accumulator

defp of(n, accumulator) do of(n-1, accumulator*n) endend

def of(n), do: of(n, 1)

of/1 of/2

Page 57: Aprenda Elixir em um final de semana

factorial.exsdefmodule Factorial do def of(n), do: of(n, 1)

defp of(0, accumulator), do: accumulator

defp of(n, accumulator) do of(n-1, accumulator*n) endend

defp of(0, accumulator), do: accumulator

Page 58: Aprenda Elixir em um final de semana

factorial.exsdefmodule Factorial do def of(n), do: of(n, 1)

defp of(0, accumulator), do: accumulator

defp of(n, accumulator) do of(n-1, accumulator*n) endend

defp of(n, accumulator) do of(n-1, accumulator*n) end

Page 59: Aprenda Elixir em um final de semana

$> elixir factorial_test.exs....

Finished in 254.2 seconds (0.05s on load, 254.2s on tests)4 tests, 0 failures

Page 60: Aprenda Elixir em um final de semana

Formando acrônimos e o operador |> (pipe)

Page 61: Aprenda Elixir em um final de semana

acronym_test.exsdefmodule AcronymTest do use ExUnit.Case, async: true

test "it produces acronyms from title case" do assert Acronym.abbreviate("Portable Networks Graphic") === "PNG" endend

Page 62: Aprenda Elixir em um final de semana

acronym.exsdefmodule Acronym do

def abbreviate(title) do separated_names = String.split(title, " ") capitalized_letters = capitalize_letters(separated_names) Enum.join(capitalized_letters) end

end

Page 63: Aprenda Elixir em um final de semana

acronym.exsdefmodule Acronym do

defp capitalize_letters(names) do Enum.map(names, fn(name) -> first_letter = String.first(name) String.capitalize(first_letter) end)end

end

Page 64: Aprenda Elixir em um final de semana

$> elixir acronym.exs.

Finished in 0.1 seconds (0.1s on load, 0.00s on tests)1 test, 0 failures

Page 65: Aprenda Elixir em um final de semana

Refatorando com o |>

Page 66: Aprenda Elixir em um final de semana

acronym.exsdefp capitalize_letters(names) do Enum.map(names, fn(name) -> String.capitalize(String.first(name)) endend

Page 67: Aprenda Elixir em um final de semana

acronym.exsdefp capitalize_letters(names) do Enum.map(names, fn(name) -> String.capitalize(String.first(name)) endend

String.capitalize(String.first(name))

Page 68: Aprenda Elixir em um final de semana

acronym.exsdefp capitalize_letters(names) do Enum.map(names, fn(name) -> String.first(name) |> String.capitalize() endend

Page 69: Aprenda Elixir em um final de semana

acronym.exsdefp capitalize_letters(names) do Enum.map(names, fn(name) -> String.first(name) |> String.capitalize() endend

String.first(name) |> String.capitalize()

Page 70: Aprenda Elixir em um final de semana

$> elixir acronym.exs.

Finished in 0.1 seconds (0.1s on load, 0.00s on tests)1 test, 0 failures

Page 71: Aprenda Elixir em um final de semana

Refatorando com o |>, de novo

Page 72: Aprenda Elixir em um final de semana

acronym.exsdefmodule Acronym do

def abbreviate(title) do separated_names = String.split(title, " ") capitalized_letters = capitalize_letters(separated_names) Enum.join(capitalized_letters) end

end

Page 73: Aprenda Elixir em um final de semana

acronym.exsdef abbreviate(title) do String.split(title, " ") |> capitalize_letters() |> Enum.join()end

Page 74: Aprenda Elixir em um final de semana

acronym.exsdef abbreviate(title) do String.split(title, " ") |> capitalize_letters() |> Enum.join()end

String.split(title, " ") |> capitalize_letters() |> Enum.join()

Page 75: Aprenda Elixir em um final de semana

$> elixir acronym.exs.

Finished in 0.1 seconds (0.1s on load, 0.00s on tests)1 test, 0 failures

Page 76: Aprenda Elixir em um final de semana
Page 77: Aprenda Elixir em um final de semana
Page 78: Aprenda Elixir em um final de semana

O que mais?Meu blog (https://brizeno.wordpress.com/tag/elixir/)

Elixir getting started (http://elixir-lang.org/getting-started/introduction.html)

Grok Podcast(http://www.grokpodcast.com/series/elixir/)

Elixir Koans(https://github.com/dojo-toulouse/elixir-koans)

exercism.io

Page 79: Aprenda Elixir em um final de semana

Próximos passos

Manipulação de listas

Mix

Phoenix web framework

Page 80: Aprenda Elixir em um final de semana

Obrigado!

@marcosbrizeno