Elixir 101

¿Qué es Elixir?
Elixir is a dynamic, functional language designed for building scalable and maintainable applications.
¿Qué es Elixir?
¿Dinámico?
Evalua el tipo de dato durante el runtime
¿Lenguaje funcional?
Programación funcional es un paradigma de programación basado en el uso de funciones matemáticas que enfatiza los cambios de estado mediante la mutación de variables.
¿Escalable?
Elixir corre sobre la VM de Erlang conocida por su baja latencia, sistemas distribuidos y tolerante a fallos.
¿Qué es la VM de Erlang?
¿Qué es Erlang?
Lenguaje funcional orientado a la concurrencia, que al igual que elixir, esta diseñado para crear aplicaciones distribuidas, paralelas y/o concurrentes.
BEAM es parte del sistema del Runtime de Erlang que compila su código (y el de Elixir) a bytecode que a su vez es ejecutado en la misma.
¿Qué es la VM de Erlang (BEAM)?
¿Qué hace potente a Elixir?

¿Qué hace potente a Elixir?
Lo que hace potente a Elixir es BEAM (Maquina virtual de Erlang), su scheduler y el framework OTP.
¿Qué es Erlang/OTP?

Conjunto de módulos, bibliotecas, patrones de diseño y comportamientos que permiten crear aplicaciones concurrentes, tolerante a fallas y distribuidas.
¿Patrón de Diseño?
Modelo de Actor

Patrón de Diseño
Modelo de Actor
El modelo de actor en ciencias de la computación es un modelo matemático de computación simultánea que trata a los “actores” como los primitivos universales de la computación concurrente.
Patrón de Diseño
Modelo de Actor

?
¿
¿Patrón de Diseño?
Modelo de Actor
El actor como unidad primitiva de computo, es aquella que recibe mensajes y realiza algún tipo de procesamiento en base al mensaje recibido.

¿Patrón de Diseño?
Modelo de Actor
Entonces, ¿El Actor es una cola de mensajes?

Patrón de Diseño
Modelo de Actor
En Elixir (Erlang) la unidad minima de computo es un proceso, cada uno tiene un "mailbox" que recibe los mensajes, que son estructuras de datos simples e inmutables.

Sintaxis

Sintaxis
defmodule Hello do
def say_hi(name) do
"Hello #{name}, I'm world, nice to meet you"
end
end
defmodule Calculator do
def sum(a,b) do
a + b
end
def mul(a,b) do
a * b
end
def subs(a,b) do
a - b
end
end
Sintaxis
defmodule Hello do
def say_hi(name) do
"Hello #{name}, I'm world, nice to meet you"
end
end
defmodule Calculator do
def sum(a,b) do
a + b
end
def mul(a,b) do
a * b
end
end
Sintaxis
https://elixir-lang.org/getting-started/introduction.html
Sintaxis
Pattern matching
Pattern matching
En Elixir (Erlang) no existe la asignación de variables sino la vinculación.
Existe el pattern matching.
Pattern matching
iex(1)> a = 1
1
iex(2)> 2 = a
** (MatchError) no match of right hand side value: 1
El cáracter "=" no es un operador de asignación si no de match
Pattern matching
iex> {a, b, c} = {:hello, "world", 42}
{:hello, "world", 42}
iex> a
:hello
iex> b
"world"
iex> [d, e, f] = [1, 2, 3]
[1, 2, 3]
iex> d
1
iex> [head | tail] = [1, 2, 3]
[1, 2, 3]
iex> head
1
iex> tail
[2, 3]
El operador match "=" también es util para desestructurar tipos de datos más complejos.
Pattern matching
defmodule Calculator
def sum(a,b) do
a + b
end
def mult(a,b) do
a * b
end
def subs(a,b) do
a - b
end
def div(a, 0) do
:error
end
def div(a, b) do
a / b
end
end
Procesos
Unidad minima de computo, todo el código de elixir corre en procesos que están aislados unos de otros, estos poseen su propia memoria, se ejecutan concurrentemente y se comunican vía paso de mensajes.
Procesos
El comando `spawn` es el mecanismo básico para ejecutar procesos.
Los mismos son asíncronos y orquestados por el scheduler de BEAM.

Procesos
Los procesos se pueden comunicar a través de los funciones `send/2` y `receive/1`
iex> send self(), {:hello, "world"}
{:hello, "world"}
iex> receive do
...> {:hello, msg} -> msg
...> {:world, msg} -> "won't match"
...> end
"world"

¿Y que se hace con todo eso?
OTP Framework

OTP Framework

Conjunto de módulos, bibliotecas, patrones de diseño y comportamientos que permiten crear aplicaciones concurrentes, tolerante a fallas y distribuidas.
OTP Framework
Comportamientos
(behaviors)
Los comportamientos en OTP, son el producto de años de refinamiento de código puesto a prueba en producción.
Los OTP Behaviours ayudan a extraer de tu código el comportamiento genérico quedando el camino libre para trabajar en la implementación del negocio.
OTP Framework
Comportamientos
(behaviors)
Entre ellos existen
- gen_server (comunicación cliente-servidor y manejos de estado)
- gen_event (manejo y suscripción a eventos)
- gen_fsm (máquina de estados finitos)
- supervisors (árbol de procesos supervisores)
OTP Framework
Comportamientos
gen_server

OTP Framework
gen_server
defmodule SimpleGenServerBehaviour do
use GenServer
def start_link() do
GenServer.start_link(__MODULE__, [])
end
def init(_) do
# runs in the server context
{:ok, 1}
end
# funciones del cliente
def get_data() do
GenServer.call(__MODULE__, :get_data)
end
def increment() do
GenServer.cast(__MODULE__, :increment)
end
# Funciones del Servidor
# Llamada sincrona
def handle_call(:get_data, _, state) do
# runs in the server context
{:reply, state, state}
end
# Llamada asincrona
def handle_cast(:increment, state) do
# runs in the server context
{:noreply, state + 1}
end
end
OTP Framework
gen_server
iex> SimpleGenServerBehaviour.start_link()
{:ok, #PID<0.106.0>}
iex> SimpleGenServerBehaviour.get_data()
1
iex> SimpleGenServerBehaviour.increment()
:ok
iex> SimpleGenServerBehaviour.get_data()
2
iex>
OTP Framework
Comportamientos
supervisor

Los supervisores proveen un manera standard y especifica de como los procesos deben ser iniciados, monitoreados por fallas y reiniciados.
OTP Framework
supervisor strategies



one_for_one
rest_for_one
one_for_all
¿Hay algo interesante hecho en Elixir?

?
¿


Phoenix Web Framework
Absinthe
Gracias

Elixir 101
By Gustavo Giménez
Elixir 101
- 489