Aprender elixir

@fedeotaran

otaran.federico@gmail.com

¿Qué aprender?

  • Instalar
  • Sobre el entorno de ejecución
  • Como ejecutar
  • Gestión de librerías
  • Tipos básicos
  • Frameworks
  • Documentar
  • Testear
  • Guías de estilo

Pero en este caso tenemos algo mas...

El paradigma

Pensar soluciones en funcional

Nuevos conceptos:

  • Inmutabilidad
  • Recurción
  • Pattern matching
  • ....

No querer implementar objetos en Elixir

Nuevo mundo

Process
Agent
Task
GenServer
Supervisor

¡Frustraciones vamos a tener!

¿Qué proponemos?

  • Humilde consejo
  • Conceptos importantes
  • Mostrar algunas herramientas

Simple     =>

Complejo

Pattern matching

El símbolo "=" es el operador match.

iex(1)> x = 2
2
iex(2)> 2 = x
2
iex(3)> 1 = x
** (MatchError) no match of right hand side value: 2
    (stdlib) erl_eval.erl:453: :erl_eval.expr/5
    (iex) lib/iex/evaluator.ex:257: IEx.Evaluator.handle_eval/5
    (iex) lib/iex/evaluator.ex:237: IEx.Evaluator.do_eval/3
    (iex) lib/iex/evaluator.ex:215: IEx.Evaluator.eval/3
    (iex) lib/iex/evaluator.ex:103: IEx.Evaluator.loop/1
    (iex) lib/iex/evaluator.ex:27: IEx.Evaluator.init/4

Ejemplo práctico

response = HTTP.patch(url, body, headers, [])
case response do
  {:ok, %{status_code: 200, body: body}} ->
    body
  {:ok, %{status_code: 404} = resp} ->
    "Error: #{resp.status_code} Not found!"
  {:error, %{reason: reason}} ->
    "Error: #{reason}"
end

Match en funciones

defmodule Math do
  def zero?(0), do: true  
  def zero?(x) when is_integer(x), do: false
end

Ejemplo completo

defmodule Person do

  defstruct [:name, :age]

  def hello!(), do: "1) Hola!"
  def hello!(%Person{name: person_name}), do: "2) Hola persona!"
  def hello!(%{name: "Mirta"} = person) do
    "3) Hola Mirta! tenes #{person.age} años"
  end
  def hello!(%{name: person_name}), do: "4) Hola #{person_name}!"
end

Se agrega a Ruby 2.7

Pipeline operator

ls | grep "Do"
string = "hello, world!"
words = String.split(string, " ")
capitalized_words = Enum.map(words, &String.capitalize/1)
Enum.join(capitalized_words, " ")
"hello, world!"
  |> String.split(" ")
  |> Enum.map(&String.capitalize/1)
  |> Enum.join

Sin pipeline operator:

Con pipeline operator:

Mix

  • Crear tareas
  • Compilar
  • Testear
  • Manejar dependencias

Comandos

 mix new

 mix compile

 iex -S mix

 mix deps.get

 mix docs

 mix test

Herramientas

Cowboy

Observer

¿Entonces?

Fin.