SlideShare a Scribd company logo
1 of 56
Download to read offline
INTRODUCTION
TO ELIXIR
Madrid |> Elixir
29/03/2016
Offered by
RUBY ON RAILS SHOP
EMBRACING ELIXIR
About me:
Javier Cuevas
@javier_dev
P2P MARKETPLACE
FOR DOG OWNERS
About
Javier
Cuevas
Victor
Viruete
Ricardo
Garcia
Bruno
Bayón
Artur
Chruszc
WHAT IS
ELIXIR?
Elixir is a dynamic, functional language
designed for building scalable and
maintainable applications.
Elixir leverages the Erlang VM, known
for running low-latency, distributed and
fault-tolerant systems.
Created by José Valim circa 2012.
Former Rails Core Team member.
He was trying to make Rails really thread
safe but... ended up creating a new
programming language. Ops!
Elixir:
• Compiles to Erlang bytecode.
• It is not Ruby compiling to Erlang.
• Can call to any Erlang library with no performance
penalty.
• Enables developers’ productivity by offering
amazing tooling and beautiful documentation.
• WhatsApp
• Facebook (Chat backend)
• Amazon (SimpleDB)
• AdRoll
• Heroku
• Yahoo (Delicious)
• Ericsson (mobile networks)
• T-Mobile (SMS)
• World of Warcra!
• ....
Erlang is that ugly language from 1996 used in production
by some “small” guys such as:
2 million connections in a single node
WHY SHOULD I
CARE ABOUT
ELIXIR?
• CPUs today have gazillion of transistors (more than
ever), and a lot of cores.
• There is no way we can keep them busy by trying to
get them do all something at once.
• The only way to keep them busy is diving the work.
• In other words:
The future is functional and concurrent.
• Elixir proves that functional programming does not
need to be mathematical or complex.
• With Elixir we can do concurrency programming
without having to use abstractions such as locks or
semaphores.
How do we program without
GOTO state?
– Computer Science, 1968
How do we program without
mutable state?
– Computer Science, 2016
SHOW ME
THAT
ELIXIR
Value Types
• Integers
(arbitrary precision)
• Floats
0.12346
• Atoms (aka symbols)
:my_atom
true, false and nil are atoms
• Ranges
start..end
start & end can by any type
• Regular expresions
~r{regexp}
Collection Types
• Tuples (not arrays)
{:ok, 42, "next"}
• Linked Lists
(closest to arrays)
list = [1,2,3,4]
hd(list) # 1
tl(list) # [2, 3, 4]
• Binaries
<<1,2>>
Strings are UTF-8 encoded binaries.
• Maps
%{ key => value, key => value }
countries = %{"ES" => "Spain",
"Fr" => "France"}
countries["ES"] # Spain
System Types
• PIDs:
Reference to local or remote process.
A new PID is created when you spawn a new
process
• Ports:
Reference to a port ^_^
Anonymous Functions
• AKA unnamed functions.
• Can be passed as arguments (they’re also a type)
• Parenthesis are optional.
iex> add = fn (a, b) -> a + b end
#Function<12.71889879/2 in :erl_eval.expr/5>
iex> add.(1, 2)
3 that dot before parenthesis is only for calling anonymous functions
Named Functions
defmodule MyModule do
def say_hello(name) do
IO.puts “Hello #{name}”
end
end
iex> MyModule.say_hello("Madrid Elixir")
Hello Madrid Elixir
Pattern Matching
• In Elixir: a = 1
does not mean we are assigning 1 to the variable a.
• The equal signs means we are asserting that the le! hand side
(LHS) is equal to the right one (RHS).
It’s like basic algebra.
iex> a = 1
1
iex> 1 = a
1
you can’t do that in non functional languages
Pattern Matching
• Instead of assigning a variable, in Elixir we talk about
binding a variable.
• In contrasts to Erlang, Elixir does allow rebinding a
variable.
iex> a = 1
1
iex> a = 2
2
Pattern Matching
Let’s do some magic:
iex> [1, a, 3] = [1, 2, 3]
[1, 2, 3]
iex> a
2
Pattern Matching
You can ignore values with “_”
iex> [a, _, _] = [1, 2, 3]
[1, 2, 3]
iex> a
1
Pattern Matching
You can reuse the previous bind value with
the pin operator “^”
iex> a = 1
1
iex> [^a, 2, 3 ] = [ 1, 2, 3 ]
[1, 2, 3]
Pattern Matching &
Function Signatures
Function signatures use pattern matching.
Therefore we can have more than one signature.
defmodule Factorial do
def of(0), do: 1
def of(x), do: x * of(x-1)
end
look mum! programing without if - else
Guards
When pattern matching is not sufficient to select the
signature to use, we can use guards.
defmodule Factorial
do def of(0), do: 1
def of(n) when n > 0 do
n * of(n-1)
end
end
Guards
defmodule MyModule do
def what_is(x) when is_number(x) do
IO.puts "#{x} is a number”
end
def what_is(x) when is_list(x) do
IO.puts "#{inspect(x)} is a list"
end
end
MyModule.what_is(99) # => 99 is a number
MyModule.what_is([1,2,3]) # => [1,2,3] is a list
you can use guards with “case” too
Macros
• Macros enable to extend the language and to create
DSLs (domain specific languages), in order to remove
boilerplate and make code more readable.
• You won’t probably create new macros unless you’re
writing a library. They should be written responsible.
Macros
• Did you know that Erlang has no “if” (as the one we
have in OOP languages)?
• Elixir does have “if”, “else” and even “unless” (because
Mr. Valim is a kind person), however it is actually a
macro.
• These 3 macros rely on “case” which... (surprise!) it uses
Pattern Matching.
Macros
http://elixir-lang.org/docs/stable/elixir/Kernel.html#if
Macros
Another cool example for a DSL created with
Macros is ExUnit, the test library that comes
with Elixir:
defmodule MathTest do
use ExUnit.Case
test "basic operations" do
assert 1 + 1 == 2
end
end
macro! macro! macro!
Exceptions?
No! Pattern Matching!
case File.open("chain.exs") do
{ :ok, file } -> # something
{ :error, reason } -> # uh oh
end
Pipe Operator |>
Typical code in OOP / imperative programming:
people = DB.find_customers
orders = Orders.for_customers(people)
tax = sales_tax(orders, 2013)
filing = prepare_filing(tax)
We could rewrite it as...
filing = prepare_filing(
sales_tax(Orders.for_customers(
DB.find_customers), 2013))
Pipe Operator |>
With Elixir pipe operator we can do just
filing = DB.find_customers
|> Orders.for_customers
|> sales_tax(2013)
|> prepare_filing
“|>” passes the result from the le! expression as the
first argument to the right expression. Kinda like the
Unix pipe “|”. It’s just useful syntax sugar.
Mix
• Mix is a build tool that ships with Elixir that provides
tasks for creating, compiling, testing your application,
managing its dependencies and much more.
• Kind of like rake (Ruby) on steroids.
Mix
➜ ~ mix --help
mix # Runs the default task (current: "mix
run")
mix app.start # Starts all registered apps
mix archive # Lists all archives
mix archive.build # Archives this project into a .ez file
mix archive.install # Installs an archive locally
mix archive.uninstall # Uninstalls archives
mix clean # Deletes generated application files
mix cmd # Executes the given command
mix compile # Compiles source files
mix deps # Lists dependencies and their status
mix deps.clean # Deletes the given dependencies' files
mix deps.compile # Compiles dependencies
mix deps.get # Gets all out of date dependencies
mix deps.unlock # Unlocks the given dependencies
mix deps.update # Updates the given dependencies
mix do # Executes the tasks separated by comma
mix escript.build # Builds an escript for the project
mix help # Prints help information for tasks
mix hex # Prints Hex help information
mix hex.build # Builds a new package version locally
mix hex.config # Reads or updates Hex config
mix hex.docs # Publishes docs for package
mix hex.info # Prints Hex information
mix hex.key # Hex API key tasks
mix hex.outdated # Shows outdated Hex deps for the
current project
mix hex.owner # Hex package ownership tasks
mix hex.public_keys # Manages Hex public keys
mix hex.publish # Publishes a new package version
mix hex.registry # Hex registry tasks
mix hex.search # Searches for package names
mix hex.user # Hex user tasks
mix loadconfig # Loads and persists the given
configuration
mix local # Lists local tasks
mix local.hex # Installs Hex locally
mix local.phoenix # Updates Phoenix locally
mix local.public_keys # Manages public keys
mix local.rebar # Installs rebar locally
mix new # Creates a new Elixir project
mix phoenix.new # Creates a new Phoenix v1.1.4
application
mix profile.fprof # Profiles the given file or expression
with fprof
mix run # Runs the given file or expression
mix test # Runs a project's tests
iex -S mix # Starts IEx and run the default task
Mixfile
defmodule MyCoolProject.Mixfile do
use Mix.Project
def project do
[ app: :my_cool_projet,
version: "0.0.1",
deps: deps ]
end
# Configuration for the OTP application
def application do
[mod: { MyCoolProject, [] }]
end
# Returns the list of dependencies in the format:
# { :foobar, git: "https://github.com/elixir-lang/foobar.git", tag: "0.1" }
#
# To specify particular versions, regardless of the tag, do:
# { :barbat, "~> 0.1", github: "elixir-lang/barbat" }
defp deps do
[
{:exactor, github: "sasa1977/exactor"},
{:"erlang-serial", github: "knewter/erlang-serial", app: false}
]
end
end
DocTests
defmodule MyModule do
@doc ~S"""
Sums two numbers
## Examples
iex> MyModule.sum(1, 2)
3
"""
def sum(a, b) do
a + b
end
end
$ mix test
Compiled lib/my_module.ex
..
Finished in 0.1 seconds (0.1s on
load, 0.00s on tests)
2 tests, 0 failures
Randomized with seed 307356
OTP
• OTP stands for Open Telecom Platform, but the name is
misleading. OTP is not only for telecom related so!ware.
• It’s a bundle that includes a large number of libraries to
solve problems like state management, application
discovery, failure detection, hot code swapping, and server
structure .
• Unfortunately, we don’t have time to talk about OTP today :/
Erlang Observer
iex> :observer.start
ELIXIR FOR
WEB APPS
Phoenix Framework
• MVC web framework created by Chris McCord. José
Valim is working on it too.
• Tastes a little bit like Ruby on Rails, but it is not.
• Aims for high developer productivity and high
application performance.
• It has powerful abstractions for creating modern web
apps in 2016, such as Channels (~ web sockets).
Phoenix Framework
• Create a new project
$ mix phoenix.new hello_phoenix
• Create database
$ mix ecto.create
• Run server
$ mix phoenix.server
Phoenix Framework
• It’s actually the top layer of a multi-layer system
designed to be modular and flexible.
• The other layers include Plug (kind of like Ruby’s Rack),
Ecto (kind of like ActiveRecord), and Cowboy, the Erlang
HTTP server.
Phoenix Framework
• Thanks to the power of Elixir and the ease of use of
Channels in Phoenix we can create web apps where we
have 1 real time bi-directional data channel with every
user (a websocket). And it scales, for real.
• Despite that WebSockets are the main transport for
Phoenix’s channels, it also supports other transport
mechanism for old browsers or embedded devices.
Phoenix Framework
• It plays nicely with the modern front-end world (ES6) by
relying on Brunch, a fast and simple asset build tool.
• It’s very easy to replace Brunch by Webpack or any other
hipster build tool of your choice.
• Note that Brunch requires Node.js (trollface).
Phoenix Framework
https://www.youtube.com/watch?v=3LiLjVCDEpU
Phoenix Framework
Phoenix Framework
HOW FAST
IS ELIXIR?
spoiler... a lot!
http://bob.ippoli.to/haskell-for-erlangers-2014/#/cost-of-concurrency
SHOWCASE
Showcase
• BSRBulb: Elixir library to control a Bluetooth Smart Bulb.
https://github.com/diacode/bsr_bulb
• Phoenix Trello: a Trello tribute with Phoenix & React.
https://github.com/bigardone/phoenix-trello
https://blog.diacode.com/trello-clone-with-phoenix-and-react-pt-1
• Phoenix Toggl: a Toggl tribute with Phoenix & React.
https://github.com/bigardone/phoenix-toggl
• Elixir Toggl API Wrapper
https://github.com/diacode/togglex
WHERE TO
GO FROM
HERE?
Next steps
• Watch every talk by José Valim. Really, you won’t regret.
• Books:
Programming Elixir – Dave Thomas
Programming Phoenix – Chris McCord, Bruce Tate & José Valim.
• Elixir Getting Started Guide (really good!)
http://elixir-lang.org/getting-started/introduction.html
• Phoenix Guide (really good!)
http://www.phoenixframework.org/docs/overview
• Elixir Radar
http://plataformatec.com.br/elixir-radar
• Madrid |> Elixir Slack (#madrid-meetup)
https://elixir-slackin.herokuapp.com/
THANK YOU
Questions?

More Related Content

What's hot

(참고) Elk stack 설치 및 kafka
(참고) Elk stack 설치 및 kafka(참고) Elk stack 설치 및 kafka
(참고) Elk stack 설치 및 kafkaNoahKIM36
 
An intro to Docker, Terraform, and Amazon ECS
An intro to Docker, Terraform, and Amazon ECSAn intro to Docker, Terraform, and Amazon ECS
An intro to Docker, Terraform, and Amazon ECSYevgeniy Brikman
 
Integration testing with spring @snow one
Integration testing with spring @snow oneIntegration testing with spring @snow one
Integration testing with spring @snow oneVictor Rentea
 
Docker Swarm 0.2.0
Docker Swarm 0.2.0Docker Swarm 0.2.0
Docker Swarm 0.2.0Docker, Inc.
 
How to Manage Scale-Out Environments with MariaDB MaxScale
How to Manage Scale-Out Environments with MariaDB MaxScaleHow to Manage Scale-Out Environments with MariaDB MaxScale
How to Manage Scale-Out Environments with MariaDB MaxScaleMariaDB plc
 
SQL Server에서 Django를 추구하면 안 되는 걸까?
SQL Server에서 Django를 추구하면 안 되는 걸까?SQL Server에서 Django를 추구하면 안 되는 걸까?
SQL Server에서 Django를 추구하면 안 되는 걸까?태환 김
 
Everything you always wanted to know about Redis but were afraid to ask
Everything you always wanted to know about Redis but were afraid to askEverything you always wanted to know about Redis but were afraid to ask
Everything you always wanted to know about Redis but were afraid to askCarlos Abalde
 
My sql failover test using orchestrator
My sql failover test  using orchestratorMy sql failover test  using orchestrator
My sql failover test using orchestratorYoungHeon (Roy) Kim
 
Docker: From Zero to Hero
Docker: From Zero to HeroDocker: From Zero to Hero
Docker: From Zero to Herofazalraja
 
20명 규모의 팀에서 Vault 사용하기
20명 규모의 팀에서 Vault 사용하기20명 규모의 팀에서 Vault 사용하기
20명 규모의 팀에서 Vault 사용하기Doyoon Kim
 
Docker 101 - from 0 to Docker in 30 minutes
Docker 101 - from 0 to Docker in 30 minutesDocker 101 - from 0 to Docker in 30 minutes
Docker 101 - from 0 to Docker in 30 minutesLuciano Fiandesio
 
MongoDB et Elasticsearch, meilleurs ennemis ?
MongoDB et Elasticsearch, meilleurs ennemis ?MongoDB et Elasticsearch, meilleurs ennemis ?
MongoDB et Elasticsearch, meilleurs ennemis ?Sébastien Prunier
 
Introduzione a Docker (Maggio 2017) [ITA]
Introduzione a Docker (Maggio 2017) [ITA]Introduzione a Docker (Maggio 2017) [ITA]
Introduzione a Docker (Maggio 2017) [ITA]Valerio Radice
 
Introduction to docker and docker compose
Introduction to docker and docker composeIntroduction to docker and docker compose
Introduction to docker and docker composeLalatendu Mohanty
 
Docker Advanced registry usage
Docker Advanced registry usageDocker Advanced registry usage
Docker Advanced registry usageDocker, Inc.
 
Docker introduction
Docker introductionDocker introduction
Docker introductiondotCloud
 
Airflow Best Practises & Roadmap to Airflow 2.0
Airflow Best Practises & Roadmap to Airflow 2.0Airflow Best Practises & Roadmap to Airflow 2.0
Airflow Best Practises & Roadmap to Airflow 2.0Kaxil Naik
 
Docker Introduction
Docker IntroductionDocker Introduction
Docker IntroductionRobert Reiz
 

What's hot (20)

(참고) Elk stack 설치 및 kafka
(참고) Elk stack 설치 및 kafka(참고) Elk stack 설치 및 kafka
(참고) Elk stack 설치 및 kafka
 
An intro to Docker, Terraform, and Amazon ECS
An intro to Docker, Terraform, and Amazon ECSAn intro to Docker, Terraform, and Amazon ECS
An intro to Docker, Terraform, and Amazon ECS
 
Integration testing with spring @snow one
Integration testing with spring @snow oneIntegration testing with spring @snow one
Integration testing with spring @snow one
 
Docker Swarm 0.2.0
Docker Swarm 0.2.0Docker Swarm 0.2.0
Docker Swarm 0.2.0
 
How to Manage Scale-Out Environments with MariaDB MaxScale
How to Manage Scale-Out Environments with MariaDB MaxScaleHow to Manage Scale-Out Environments with MariaDB MaxScale
How to Manage Scale-Out Environments with MariaDB MaxScale
 
SQL Server에서 Django를 추구하면 안 되는 걸까?
SQL Server에서 Django를 추구하면 안 되는 걸까?SQL Server에서 Django를 추구하면 안 되는 걸까?
SQL Server에서 Django를 추구하면 안 되는 걸까?
 
Everything you always wanted to know about Redis but were afraid to ask
Everything you always wanted to know about Redis but were afraid to askEverything you always wanted to know about Redis but were afraid to ask
Everything you always wanted to know about Redis but were afraid to ask
 
How to Design Indexes, Really
How to Design Indexes, ReallyHow to Design Indexes, Really
How to Design Indexes, Really
 
My sql failover test using orchestrator
My sql failover test  using orchestratorMy sql failover test  using orchestrator
My sql failover test using orchestrator
 
Docker: From Zero to Hero
Docker: From Zero to HeroDocker: From Zero to Hero
Docker: From Zero to Hero
 
20명 규모의 팀에서 Vault 사용하기
20명 규모의 팀에서 Vault 사용하기20명 규모의 팀에서 Vault 사용하기
20명 규모의 팀에서 Vault 사용하기
 
Docker 101 - from 0 to Docker in 30 minutes
Docker 101 - from 0 to Docker in 30 minutesDocker 101 - from 0 to Docker in 30 minutes
Docker 101 - from 0 to Docker in 30 minutes
 
MongoDB et Elasticsearch, meilleurs ennemis ?
MongoDB et Elasticsearch, meilleurs ennemis ?MongoDB et Elasticsearch, meilleurs ennemis ?
MongoDB et Elasticsearch, meilleurs ennemis ?
 
Docker & kubernetes
Docker & kubernetesDocker & kubernetes
Docker & kubernetes
 
Introduzione a Docker (Maggio 2017) [ITA]
Introduzione a Docker (Maggio 2017) [ITA]Introduzione a Docker (Maggio 2017) [ITA]
Introduzione a Docker (Maggio 2017) [ITA]
 
Introduction to docker and docker compose
Introduction to docker and docker composeIntroduction to docker and docker compose
Introduction to docker and docker compose
 
Docker Advanced registry usage
Docker Advanced registry usageDocker Advanced registry usage
Docker Advanced registry usage
 
Docker introduction
Docker introductionDocker introduction
Docker introduction
 
Airflow Best Practises & Roadmap to Airflow 2.0
Airflow Best Practises & Roadmap to Airflow 2.0Airflow Best Practises & Roadmap to Airflow 2.0
Airflow Best Practises & Roadmap to Airflow 2.0
 
Docker Introduction
Docker IntroductionDocker Introduction
Docker Introduction
 

Viewers also liked

7 Stages of Unit Testing in iOS
7 Stages of Unit Testing in iOS7 Stages of Unit Testing in iOS
7 Stages of Unit Testing in iOSJorge Ortiz
 
Emoticritico: midiendo las emociones de los políticos
Emoticritico: midiendo las emociones de los políticosEmoticritico: midiendo las emociones de los políticos
Emoticritico: midiendo las emociones de los políticosIsrael Gutiérrez
 
Aceleradoras de startups educativas
Aceleradoras de startups educativasAceleradoras de startups educativas
Aceleradoras de startups educativasAurelio Jimenez
 
Make startup development great again!
Make startup development great again!Make startup development great again!
Make startup development great again!Israel Gutiérrez
 
Flow-based programming with Elixir
Flow-based programming with ElixirFlow-based programming with Elixir
Flow-based programming with ElixirAnton Mishchuk
 
Hello elixir (and otp)
Hello elixir (and otp)Hello elixir (and otp)
Hello elixir (and otp)Abel Muíño
 
Elixir Into Production
Elixir Into ProductionElixir Into Production
Elixir Into ProductionJamie Winsor
 
How Elixir helped us scale our Video User Profile Service for the Olympics
How Elixir helped us scale our Video User Profile Service for the OlympicsHow Elixir helped us scale our Video User Profile Service for the Olympics
How Elixir helped us scale our Video User Profile Service for the OlympicsEmerson Macedo
 
Elixir – Peeking into Elixir's Processes, OTP and Supervisors
Elixir – Peeking into Elixir's Processes, OTP and SupervisorsElixir – Peeking into Elixir's Processes, OTP and Supervisors
Elixir – Peeking into Elixir's Processes, OTP and SupervisorsBenjamin Tan
 
Learn Elixir at Manchester Lambda Lounge
Learn Elixir at Manchester Lambda LoungeLearn Elixir at Manchester Lambda Lounge
Learn Elixir at Manchester Lambda LoungeChi-chi Ekweozor
 
Syrup,elixir,spirits
Syrup,elixir,spiritsSyrup,elixir,spirits
Syrup,elixir,spiritsarjun kaushik
 
Phoenix for Rails Devs
Phoenix for Rails DevsPhoenix for Rails Devs
Phoenix for Rails DevsDiacode
 
Erlang e Elixir por uma web mais feliz
Erlang e Elixir por uma web mais felizErlang e Elixir por uma web mais feliz
Erlang e Elixir por uma web mais felizBruno Henrique - Garu
 
Functional Programming with Ruby
Functional Programming with RubyFunctional Programming with Ruby
Functional Programming with Rubytokland
 

Viewers also liked (20)

7 Stages of Unit Testing in iOS
7 Stages of Unit Testing in iOS7 Stages of Unit Testing in iOS
7 Stages of Unit Testing in iOS
 
Emoticritico: midiendo las emociones de los políticos
Emoticritico: midiendo las emociones de los políticosEmoticritico: midiendo las emociones de los políticos
Emoticritico: midiendo las emociones de los políticos
 
Aceleradoras de startups educativas
Aceleradoras de startups educativasAceleradoras de startups educativas
Aceleradoras de startups educativas
 
Make startup development great again!
Make startup development great again!Make startup development great again!
Make startup development great again!
 
Elixirs
ElixirsElixirs
Elixirs
 
Flow-based programming with Elixir
Flow-based programming with ElixirFlow-based programming with Elixir
Flow-based programming with Elixir
 
Hello elixir (and otp)
Hello elixir (and otp)Hello elixir (and otp)
Hello elixir (and otp)
 
Elixir intro
Elixir introElixir intro
Elixir intro
 
Elixir Into Production
Elixir Into ProductionElixir Into Production
Elixir Into Production
 
Elixir
ElixirElixir
Elixir
 
How Elixir helped us scale our Video User Profile Service for the Olympics
How Elixir helped us scale our Video User Profile Service for the OlympicsHow Elixir helped us scale our Video User Profile Service for the Olympics
How Elixir helped us scale our Video User Profile Service for the Olympics
 
Elixir basics-2
Elixir basics-2Elixir basics-2
Elixir basics-2
 
Elixir – Peeking into Elixir's Processes, OTP and Supervisors
Elixir – Peeking into Elixir's Processes, OTP and SupervisorsElixir – Peeking into Elixir's Processes, OTP and Supervisors
Elixir – Peeking into Elixir's Processes, OTP and Supervisors
 
Learn Elixir at Manchester Lambda Lounge
Learn Elixir at Manchester Lambda LoungeLearn Elixir at Manchester Lambda Lounge
Learn Elixir at Manchester Lambda Lounge
 
The Magic Of Elixir
The Magic Of ElixirThe Magic Of Elixir
The Magic Of Elixir
 
Syrup,elixir,spirits
Syrup,elixir,spiritsSyrup,elixir,spirits
Syrup,elixir,spirits
 
Phoenix for Rails Devs
Phoenix for Rails DevsPhoenix for Rails Devs
Phoenix for Rails Devs
 
Erlang e Elixir por uma web mais feliz
Erlang e Elixir por uma web mais felizErlang e Elixir por uma web mais feliz
Erlang e Elixir por uma web mais feliz
 
Erlang and Elixir
Erlang and ElixirErlang and Elixir
Erlang and Elixir
 
Functional Programming with Ruby
Functional Programming with RubyFunctional Programming with Ruby
Functional Programming with Ruby
 

Similar to Introduction to Elixir

Introducing Elixir and OTP at the Erlang BASH
Introducing Elixir and OTP at the Erlang BASHIntroducing Elixir and OTP at the Erlang BASH
Introducing Elixir and OTP at the Erlang BASHdevbash
 
Echtzeitapplikationen mit Elixir und GraphQL
Echtzeitapplikationen mit Elixir und GraphQLEchtzeitapplikationen mit Elixir und GraphQL
Echtzeitapplikationen mit Elixir und GraphQLMoritz Flucht
 
Lex tool manual
Lex tool manualLex tool manual
Lex tool manualSami Said
 
Kostis Sagonas: Cool Tools for Modern Erlang Program Developmen
Kostis Sagonas: Cool Tools for Modern Erlang Program DevelopmenKostis Sagonas: Cool Tools for Modern Erlang Program Developmen
Kostis Sagonas: Cool Tools for Modern Erlang Program DevelopmenKonstantin Sorokin
 
PYTHON -Chapter 2 - Functions, Exception, Modules and Files -MAULIK BOR...
PYTHON -Chapter 2 - Functions,   Exception, Modules  and    Files -MAULIK BOR...PYTHON -Chapter 2 - Functions,   Exception, Modules  and    Files -MAULIK BOR...
PYTHON -Chapter 2 - Functions, Exception, Modules and Files -MAULIK BOR...Maulik Borsaniya
 
嵌入式Linux課程-GNU Toolchain
嵌入式Linux課程-GNU Toolchain嵌入式Linux課程-GNU Toolchain
嵌入式Linux課程-GNU Toolchain艾鍗科技
 
Introduction to Python 01-08-2023.pon by everyone else. . Hence, they must be...
Introduction to Python 01-08-2023.pon by everyone else. . Hence, they must be...Introduction to Python 01-08-2023.pon by everyone else. . Hence, they must be...
Introduction to Python 01-08-2023.pon by everyone else. . Hence, they must be...DRVaibhavmeshram1
 
Intro to React
Intro to ReactIntro to React
Intro to ReactTroy Miles
 
Rails Tips and Best Practices
Rails Tips and Best PracticesRails Tips and Best Practices
Rails Tips and Best PracticesDavid Keener
 
React Native Evening
React Native EveningReact Native Evening
React Native EveningTroy Miles
 
A tour on ruby and friends
A tour on ruby and friendsA tour on ruby and friends
A tour on ruby and friends旻琦 潘
 
Introduction to Elixir
Introduction to ElixirIntroduction to Elixir
Introduction to Elixirbrien_wankel
 

Similar to Introduction to Elixir (20)

Introducing Elixir and OTP at the Erlang BASH
Introducing Elixir and OTP at the Erlang BASHIntroducing Elixir and OTP at the Erlang BASH
Introducing Elixir and OTP at the Erlang BASH
 
Elixir
ElixirElixir
Elixir
 
Echtzeitapplikationen mit Elixir und GraphQL
Echtzeitapplikationen mit Elixir und GraphQLEchtzeitapplikationen mit Elixir und GraphQL
Echtzeitapplikationen mit Elixir und GraphQL
 
Clojure intro
Clojure introClojure intro
Clojure intro
 
Bioinformatics v2014 wim_vancriekinge
Bioinformatics v2014 wim_vancriekingeBioinformatics v2014 wim_vancriekinge
Bioinformatics v2014 wim_vancriekinge
 
Lex tool manual
Lex tool manualLex tool manual
Lex tool manual
 
Kostis Sagonas: Cool Tools for Modern Erlang Program Developmen
Kostis Sagonas: Cool Tools for Modern Erlang Program DevelopmenKostis Sagonas: Cool Tools for Modern Erlang Program Developmen
Kostis Sagonas: Cool Tools for Modern Erlang Program Developmen
 
PYTHON -Chapter 2 - Functions, Exception, Modules and Files -MAULIK BOR...
PYTHON -Chapter 2 - Functions,   Exception, Modules  and    Files -MAULIK BOR...PYTHON -Chapter 2 - Functions,   Exception, Modules  and    Files -MAULIK BOR...
PYTHON -Chapter 2 - Functions, Exception, Modules and Files -MAULIK BOR...
 
Eclipse meets e4
Eclipse meets e4Eclipse meets e4
Eclipse meets e4
 
嵌入式Linux課程-GNU Toolchain
嵌入式Linux課程-GNU Toolchain嵌入式Linux課程-GNU Toolchain
嵌入式Linux課程-GNU Toolchain
 
Meta Object Protocols
Meta Object ProtocolsMeta Object Protocols
Meta Object Protocols
 
Introduction to Python 01-08-2023.pon by everyone else. . Hence, they must be...
Introduction to Python 01-08-2023.pon by everyone else. . Hence, they must be...Introduction to Python 01-08-2023.pon by everyone else. . Hence, they must be...
Introduction to Python 01-08-2023.pon by everyone else. . Hence, they must be...
 
Intro to Elixir talk
Intro to Elixir talkIntro to Elixir talk
Intro to Elixir talk
 
Elixir
ElixirElixir
Elixir
 
Intro to React
Intro to ReactIntro to React
Intro to React
 
Rails Tips and Best Practices
Rails Tips and Best PracticesRails Tips and Best Practices
Rails Tips and Best Practices
 
React Native Evening
React Native EveningReact Native Evening
React Native Evening
 
A tour on ruby and friends
A tour on ruby and friendsA tour on ruby and friends
A tour on ruby and friends
 
Elixir introduction
Elixir introductionElixir introduction
Elixir introduction
 
Introduction to Elixir
Introduction to ElixirIntroduction to Elixir
Introduction to Elixir
 

More from Diacode

CI/CD with Kubernetes, Helm & Wercker (#madScalability)
CI/CD with Kubernetes, Helm & Wercker (#madScalability)CI/CD with Kubernetes, Helm & Wercker (#madScalability)
CI/CD with Kubernetes, Helm & Wercker (#madScalability)Diacode
 
Startup nomads
Startup nomadsStartup nomads
Startup nomadsDiacode
 
Ruby on Rails & TDD con RSpec
Ruby on Rails & TDD con RSpecRuby on Rails & TDD con RSpec
Ruby on Rails & TDD con RSpecDiacode
 
Hacking your bank with Ruby and reverse engineering (Madrid.rb)
Hacking your bank with Ruby and reverse engineering (Madrid.rb)Hacking your bank with Ruby and reverse engineering (Madrid.rb)
Hacking your bank with Ruby and reverse engineering (Madrid.rb)Diacode
 
TLKR.io @ Betabeers Madrid
TLKR.io @ Betabeers MadridTLKR.io @ Betabeers Madrid
TLKR.io @ Betabeers MadridDiacode
 
Métricas para hacer crecer tu proyecto
Métricas para hacer crecer tu proyectoMétricas para hacer crecer tu proyecto
Métricas para hacer crecer tu proyectoDiacode
 
Métricas para hacer crecer tu proyecto
Métricas para hacer crecer tu proyectoMétricas para hacer crecer tu proyecto
Métricas para hacer crecer tu proyectoDiacode
 
Presentación de Kogi
Presentación de KogiPresentación de Kogi
Presentación de KogiDiacode
 
Educación: The Next Big Thing
Educación: The Next Big ThingEducación: The Next Big Thing
Educación: The Next Big ThingDiacode
 
Front-End Frameworks: a quick overview
Front-End Frameworks: a quick overviewFront-End Frameworks: a quick overview
Front-End Frameworks: a quick overviewDiacode
 
Taller de Introducción a Ruby on Rails (2ª parte)
Taller de Introducción a Ruby on Rails (2ª parte)Taller de Introducción a Ruby on Rails (2ª parte)
Taller de Introducción a Ruby on Rails (2ª parte)Diacode
 
Taller de Introducción a Ruby on Rails
Taller de Introducción a Ruby on RailsTaller de Introducción a Ruby on Rails
Taller de Introducción a Ruby on RailsDiacode
 

More from Diacode (12)

CI/CD with Kubernetes, Helm & Wercker (#madScalability)
CI/CD with Kubernetes, Helm & Wercker (#madScalability)CI/CD with Kubernetes, Helm & Wercker (#madScalability)
CI/CD with Kubernetes, Helm & Wercker (#madScalability)
 
Startup nomads
Startup nomadsStartup nomads
Startup nomads
 
Ruby on Rails & TDD con RSpec
Ruby on Rails & TDD con RSpecRuby on Rails & TDD con RSpec
Ruby on Rails & TDD con RSpec
 
Hacking your bank with Ruby and reverse engineering (Madrid.rb)
Hacking your bank with Ruby and reverse engineering (Madrid.rb)Hacking your bank with Ruby and reverse engineering (Madrid.rb)
Hacking your bank with Ruby and reverse engineering (Madrid.rb)
 
TLKR.io @ Betabeers Madrid
TLKR.io @ Betabeers MadridTLKR.io @ Betabeers Madrid
TLKR.io @ Betabeers Madrid
 
Métricas para hacer crecer tu proyecto
Métricas para hacer crecer tu proyectoMétricas para hacer crecer tu proyecto
Métricas para hacer crecer tu proyecto
 
Métricas para hacer crecer tu proyecto
Métricas para hacer crecer tu proyectoMétricas para hacer crecer tu proyecto
Métricas para hacer crecer tu proyecto
 
Presentación de Kogi
Presentación de KogiPresentación de Kogi
Presentación de Kogi
 
Educación: The Next Big Thing
Educación: The Next Big ThingEducación: The Next Big Thing
Educación: The Next Big Thing
 
Front-End Frameworks: a quick overview
Front-End Frameworks: a quick overviewFront-End Frameworks: a quick overview
Front-End Frameworks: a quick overview
 
Taller de Introducción a Ruby on Rails (2ª parte)
Taller de Introducción a Ruby on Rails (2ª parte)Taller de Introducción a Ruby on Rails (2ª parte)
Taller de Introducción a Ruby on Rails (2ª parte)
 
Taller de Introducción a Ruby on Rails
Taller de Introducción a Ruby on RailsTaller de Introducción a Ruby on Rails
Taller de Introducción a Ruby on Rails
 

Recently uploaded

BATTLEFIELD ORM: TIPS, TACTICS AND STRATEGIES FOR CONQUERING YOUR DATABASE
BATTLEFIELD ORM: TIPS, TACTICS AND STRATEGIES FOR CONQUERING YOUR DATABASEBATTLEFIELD ORM: TIPS, TACTICS AND STRATEGIES FOR CONQUERING YOUR DATABASE
BATTLEFIELD ORM: TIPS, TACTICS AND STRATEGIES FOR CONQUERING YOUR DATABASEOrtus Solutions, Corp
 
Unveiling the Future: Sylius 2.0 New Features
Unveiling the Future: Sylius 2.0 New FeaturesUnveiling the Future: Sylius 2.0 New Features
Unveiling the Future: Sylius 2.0 New FeaturesŁukasz Chruściel
 
PREDICTING RIVER WATER QUALITY ppt presentation
PREDICTING  RIVER  WATER QUALITY  ppt presentationPREDICTING  RIVER  WATER QUALITY  ppt presentation
PREDICTING RIVER WATER QUALITY ppt presentationvaddepallysandeep122
 
Building a General PDE Solving Framework with Symbolic-Numeric Scientific Mac...
Building a General PDE Solving Framework with Symbolic-Numeric Scientific Mac...Building a General PDE Solving Framework with Symbolic-Numeric Scientific Mac...
Building a General PDE Solving Framework with Symbolic-Numeric Scientific Mac...stazi3110
 
How to Track Employee Performance A Comprehensive Guide.pdf
How to Track Employee Performance A Comprehensive Guide.pdfHow to Track Employee Performance A Comprehensive Guide.pdf
How to Track Employee Performance A Comprehensive Guide.pdfLivetecs LLC
 
How to submit a standout Adobe Champion Application
How to submit a standout Adobe Champion ApplicationHow to submit a standout Adobe Champion Application
How to submit a standout Adobe Champion ApplicationBradBedford3
 
A healthy diet for your Java application Devoxx France.pdf
A healthy diet for your Java application Devoxx France.pdfA healthy diet for your Java application Devoxx France.pdf
A healthy diet for your Java application Devoxx France.pdfMarharyta Nedzelska
 
英国UN学位证,北安普顿大学毕业证书1:1制作
英国UN学位证,北安普顿大学毕业证书1:1制作英国UN学位证,北安普顿大学毕业证书1:1制作
英国UN学位证,北安普顿大学毕业证书1:1制作qr0udbr0
 
SpotFlow: Tracking Method Calls and States at Runtime
SpotFlow: Tracking Method Calls and States at RuntimeSpotFlow: Tracking Method Calls and States at Runtime
SpotFlow: Tracking Method Calls and States at Runtimeandrehoraa
 
Call Us🔝>༒+91-9711147426⇛Call In girls karol bagh (Delhi)
Call Us🔝>༒+91-9711147426⇛Call In girls karol bagh (Delhi)Call Us🔝>༒+91-9711147426⇛Call In girls karol bagh (Delhi)
Call Us🔝>༒+91-9711147426⇛Call In girls karol bagh (Delhi)jennyeacort
 
Cloud Data Center Network Construction - IEEE
Cloud Data Center Network Construction - IEEECloud Data Center Network Construction - IEEE
Cloud Data Center Network Construction - IEEEVICTOR MAESTRE RAMIREZ
 
CRM Contender Series: HubSpot vs. Salesforce
CRM Contender Series: HubSpot vs. SalesforceCRM Contender Series: HubSpot vs. Salesforce
CRM Contender Series: HubSpot vs. SalesforceBrainSell Technologies
 
What are the key points to focus on before starting to learn ETL Development....
What are the key points to focus on before starting to learn ETL Development....What are the key points to focus on before starting to learn ETL Development....
What are the key points to focus on before starting to learn ETL Development....kzayra69
 
办理学位证(UQ文凭证书)昆士兰大学毕业证成绩单原版一模一样
办理学位证(UQ文凭证书)昆士兰大学毕业证成绩单原版一模一样办理学位证(UQ文凭证书)昆士兰大学毕业证成绩单原版一模一样
办理学位证(UQ文凭证书)昆士兰大学毕业证成绩单原版一模一样umasea
 
Automate your Kamailio Test Calls - Kamailio World 2024
Automate your Kamailio Test Calls - Kamailio World 2024Automate your Kamailio Test Calls - Kamailio World 2024
Automate your Kamailio Test Calls - Kamailio World 2024Andreas Granig
 
Implementing Zero Trust strategy with Azure
Implementing Zero Trust strategy with AzureImplementing Zero Trust strategy with Azure
Implementing Zero Trust strategy with AzureDinusha Kumarasiri
 
Ahmed Motair CV April 2024 (Senior SW Developer)
Ahmed Motair CV April 2024 (Senior SW Developer)Ahmed Motair CV April 2024 (Senior SW Developer)
Ahmed Motair CV April 2024 (Senior SW Developer)Ahmed Mater
 
What is Advanced Excel and what are some best practices for designing and cre...
What is Advanced Excel and what are some best practices for designing and cre...What is Advanced Excel and what are some best practices for designing and cre...
What is Advanced Excel and what are some best practices for designing and cre...Technogeeks
 
GOING AOT WITH GRAALVM – DEVOXX GREECE.pdf
GOING AOT WITH GRAALVM – DEVOXX GREECE.pdfGOING AOT WITH GRAALVM – DEVOXX GREECE.pdf
GOING AOT WITH GRAALVM – DEVOXX GREECE.pdfAlina Yurenko
 

Recently uploaded (20)

BATTLEFIELD ORM: TIPS, TACTICS AND STRATEGIES FOR CONQUERING YOUR DATABASE
BATTLEFIELD ORM: TIPS, TACTICS AND STRATEGIES FOR CONQUERING YOUR DATABASEBATTLEFIELD ORM: TIPS, TACTICS AND STRATEGIES FOR CONQUERING YOUR DATABASE
BATTLEFIELD ORM: TIPS, TACTICS AND STRATEGIES FOR CONQUERING YOUR DATABASE
 
Unveiling the Future: Sylius 2.0 New Features
Unveiling the Future: Sylius 2.0 New FeaturesUnveiling the Future: Sylius 2.0 New Features
Unveiling the Future: Sylius 2.0 New Features
 
PREDICTING RIVER WATER QUALITY ppt presentation
PREDICTING  RIVER  WATER QUALITY  ppt presentationPREDICTING  RIVER  WATER QUALITY  ppt presentation
PREDICTING RIVER WATER QUALITY ppt presentation
 
Advantages of Odoo ERP 17 for Your Business
Advantages of Odoo ERP 17 for Your BusinessAdvantages of Odoo ERP 17 for Your Business
Advantages of Odoo ERP 17 for Your Business
 
Building a General PDE Solving Framework with Symbolic-Numeric Scientific Mac...
Building a General PDE Solving Framework with Symbolic-Numeric Scientific Mac...Building a General PDE Solving Framework with Symbolic-Numeric Scientific Mac...
Building a General PDE Solving Framework with Symbolic-Numeric Scientific Mac...
 
How to Track Employee Performance A Comprehensive Guide.pdf
How to Track Employee Performance A Comprehensive Guide.pdfHow to Track Employee Performance A Comprehensive Guide.pdf
How to Track Employee Performance A Comprehensive Guide.pdf
 
How to submit a standout Adobe Champion Application
How to submit a standout Adobe Champion ApplicationHow to submit a standout Adobe Champion Application
How to submit a standout Adobe Champion Application
 
A healthy diet for your Java application Devoxx France.pdf
A healthy diet for your Java application Devoxx France.pdfA healthy diet for your Java application Devoxx France.pdf
A healthy diet for your Java application Devoxx France.pdf
 
英国UN学位证,北安普顿大学毕业证书1:1制作
英国UN学位证,北安普顿大学毕业证书1:1制作英国UN学位证,北安普顿大学毕业证书1:1制作
英国UN学位证,北安普顿大学毕业证书1:1制作
 
SpotFlow: Tracking Method Calls and States at Runtime
SpotFlow: Tracking Method Calls and States at RuntimeSpotFlow: Tracking Method Calls and States at Runtime
SpotFlow: Tracking Method Calls and States at Runtime
 
Call Us🔝>༒+91-9711147426⇛Call In girls karol bagh (Delhi)
Call Us🔝>༒+91-9711147426⇛Call In girls karol bagh (Delhi)Call Us🔝>༒+91-9711147426⇛Call In girls karol bagh (Delhi)
Call Us🔝>༒+91-9711147426⇛Call In girls karol bagh (Delhi)
 
Cloud Data Center Network Construction - IEEE
Cloud Data Center Network Construction - IEEECloud Data Center Network Construction - IEEE
Cloud Data Center Network Construction - IEEE
 
CRM Contender Series: HubSpot vs. Salesforce
CRM Contender Series: HubSpot vs. SalesforceCRM Contender Series: HubSpot vs. Salesforce
CRM Contender Series: HubSpot vs. Salesforce
 
What are the key points to focus on before starting to learn ETL Development....
What are the key points to focus on before starting to learn ETL Development....What are the key points to focus on before starting to learn ETL Development....
What are the key points to focus on before starting to learn ETL Development....
 
办理学位证(UQ文凭证书)昆士兰大学毕业证成绩单原版一模一样
办理学位证(UQ文凭证书)昆士兰大学毕业证成绩单原版一模一样办理学位证(UQ文凭证书)昆士兰大学毕业证成绩单原版一模一样
办理学位证(UQ文凭证书)昆士兰大学毕业证成绩单原版一模一样
 
Automate your Kamailio Test Calls - Kamailio World 2024
Automate your Kamailio Test Calls - Kamailio World 2024Automate your Kamailio Test Calls - Kamailio World 2024
Automate your Kamailio Test Calls - Kamailio World 2024
 
Implementing Zero Trust strategy with Azure
Implementing Zero Trust strategy with AzureImplementing Zero Trust strategy with Azure
Implementing Zero Trust strategy with Azure
 
Ahmed Motair CV April 2024 (Senior SW Developer)
Ahmed Motair CV April 2024 (Senior SW Developer)Ahmed Motair CV April 2024 (Senior SW Developer)
Ahmed Motair CV April 2024 (Senior SW Developer)
 
What is Advanced Excel and what are some best practices for designing and cre...
What is Advanced Excel and what are some best practices for designing and cre...What is Advanced Excel and what are some best practices for designing and cre...
What is Advanced Excel and what are some best practices for designing and cre...
 
GOING AOT WITH GRAALVM – DEVOXX GREECE.pdf
GOING AOT WITH GRAALVM – DEVOXX GREECE.pdfGOING AOT WITH GRAALVM – DEVOXX GREECE.pdf
GOING AOT WITH GRAALVM – DEVOXX GREECE.pdf
 

Introduction to Elixir

  • 1. INTRODUCTION TO ELIXIR Madrid |> Elixir 29/03/2016 Offered by
  • 2. RUBY ON RAILS SHOP EMBRACING ELIXIR About me: Javier Cuevas @javier_dev P2P MARKETPLACE FOR DOG OWNERS
  • 5. Elixir is a dynamic, functional language designed for building scalable and maintainable applications. Elixir leverages the Erlang VM, known for running low-latency, distributed and fault-tolerant systems.
  • 6. Created by José Valim circa 2012. Former Rails Core Team member. He was trying to make Rails really thread safe but... ended up creating a new programming language. Ops!
  • 7. Elixir: • Compiles to Erlang bytecode. • It is not Ruby compiling to Erlang. • Can call to any Erlang library with no performance penalty. • Enables developers’ productivity by offering amazing tooling and beautiful documentation.
  • 8. • WhatsApp • Facebook (Chat backend) • Amazon (SimpleDB) • AdRoll • Heroku • Yahoo (Delicious) • Ericsson (mobile networks) • T-Mobile (SMS) • World of Warcra! • .... Erlang is that ugly language from 1996 used in production by some “small” guys such as: 2 million connections in a single node
  • 9. WHY SHOULD I CARE ABOUT ELIXIR?
  • 10. • CPUs today have gazillion of transistors (more than ever), and a lot of cores. • There is no way we can keep them busy by trying to get them do all something at once. • The only way to keep them busy is diving the work. • In other words: The future is functional and concurrent.
  • 11. • Elixir proves that functional programming does not need to be mathematical or complex. • With Elixir we can do concurrency programming without having to use abstractions such as locks or semaphores.
  • 12. How do we program without GOTO state? – Computer Science, 1968 How do we program without mutable state? – Computer Science, 2016
  • 14. Value Types • Integers (arbitrary precision) • Floats 0.12346 • Atoms (aka symbols) :my_atom true, false and nil are atoms • Ranges start..end start & end can by any type • Regular expresions ~r{regexp}
  • 15. Collection Types • Tuples (not arrays) {:ok, 42, "next"} • Linked Lists (closest to arrays) list = [1,2,3,4] hd(list) # 1 tl(list) # [2, 3, 4] • Binaries <<1,2>> Strings are UTF-8 encoded binaries. • Maps %{ key => value, key => value } countries = %{"ES" => "Spain", "Fr" => "France"} countries["ES"] # Spain
  • 16. System Types • PIDs: Reference to local or remote process. A new PID is created when you spawn a new process • Ports: Reference to a port ^_^
  • 17. Anonymous Functions • AKA unnamed functions. • Can be passed as arguments (they’re also a type) • Parenthesis are optional. iex> add = fn (a, b) -> a + b end #Function<12.71889879/2 in :erl_eval.expr/5> iex> add.(1, 2) 3 that dot before parenthesis is only for calling anonymous functions
  • 18. Named Functions defmodule MyModule do def say_hello(name) do IO.puts “Hello #{name}” end end iex> MyModule.say_hello("Madrid Elixir") Hello Madrid Elixir
  • 19. Pattern Matching • In Elixir: a = 1 does not mean we are assigning 1 to the variable a. • The equal signs means we are asserting that the le! hand side (LHS) is equal to the right one (RHS). It’s like basic algebra. iex> a = 1 1 iex> 1 = a 1 you can’t do that in non functional languages
  • 20. Pattern Matching • Instead of assigning a variable, in Elixir we talk about binding a variable. • In contrasts to Erlang, Elixir does allow rebinding a variable. iex> a = 1 1 iex> a = 2 2
  • 21. Pattern Matching Let’s do some magic: iex> [1, a, 3] = [1, 2, 3] [1, 2, 3] iex> a 2
  • 22. Pattern Matching You can ignore values with “_” iex> [a, _, _] = [1, 2, 3] [1, 2, 3] iex> a 1
  • 23. Pattern Matching You can reuse the previous bind value with the pin operator “^” iex> a = 1 1 iex> [^a, 2, 3 ] = [ 1, 2, 3 ] [1, 2, 3]
  • 24. Pattern Matching & Function Signatures Function signatures use pattern matching. Therefore we can have more than one signature. defmodule Factorial do def of(0), do: 1 def of(x), do: x * of(x-1) end look mum! programing without if - else
  • 25. Guards When pattern matching is not sufficient to select the signature to use, we can use guards. defmodule Factorial do def of(0), do: 1 def of(n) when n > 0 do n * of(n-1) end end
  • 26. Guards defmodule MyModule do def what_is(x) when is_number(x) do IO.puts "#{x} is a number” end def what_is(x) when is_list(x) do IO.puts "#{inspect(x)} is a list" end end MyModule.what_is(99) # => 99 is a number MyModule.what_is([1,2,3]) # => [1,2,3] is a list you can use guards with “case” too
  • 27. Macros • Macros enable to extend the language and to create DSLs (domain specific languages), in order to remove boilerplate and make code more readable. • You won’t probably create new macros unless you’re writing a library. They should be written responsible.
  • 28. Macros • Did you know that Erlang has no “if” (as the one we have in OOP languages)? • Elixir does have “if”, “else” and even “unless” (because Mr. Valim is a kind person), however it is actually a macro. • These 3 macros rely on “case” which... (surprise!) it uses Pattern Matching.
  • 30. Macros Another cool example for a DSL created with Macros is ExUnit, the test library that comes with Elixir: defmodule MathTest do use ExUnit.Case test "basic operations" do assert 1 + 1 == 2 end end macro! macro! macro!
  • 31. Exceptions? No! Pattern Matching! case File.open("chain.exs") do { :ok, file } -> # something { :error, reason } -> # uh oh end
  • 32. Pipe Operator |> Typical code in OOP / imperative programming: people = DB.find_customers orders = Orders.for_customers(people) tax = sales_tax(orders, 2013) filing = prepare_filing(tax) We could rewrite it as... filing = prepare_filing( sales_tax(Orders.for_customers( DB.find_customers), 2013))
  • 33. Pipe Operator |> With Elixir pipe operator we can do just filing = DB.find_customers |> Orders.for_customers |> sales_tax(2013) |> prepare_filing “|>” passes the result from the le! expression as the first argument to the right expression. Kinda like the Unix pipe “|”. It’s just useful syntax sugar.
  • 34. Mix • Mix is a build tool that ships with Elixir that provides tasks for creating, compiling, testing your application, managing its dependencies and much more. • Kind of like rake (Ruby) on steroids.
  • 35. Mix ➜ ~ mix --help mix # Runs the default task (current: "mix run") mix app.start # Starts all registered apps mix archive # Lists all archives mix archive.build # Archives this project into a .ez file mix archive.install # Installs an archive locally mix archive.uninstall # Uninstalls archives mix clean # Deletes generated application files mix cmd # Executes the given command mix compile # Compiles source files mix deps # Lists dependencies and their status mix deps.clean # Deletes the given dependencies' files mix deps.compile # Compiles dependencies mix deps.get # Gets all out of date dependencies mix deps.unlock # Unlocks the given dependencies mix deps.update # Updates the given dependencies mix do # Executes the tasks separated by comma mix escript.build # Builds an escript for the project mix help # Prints help information for tasks mix hex # Prints Hex help information mix hex.build # Builds a new package version locally mix hex.config # Reads or updates Hex config mix hex.docs # Publishes docs for package mix hex.info # Prints Hex information mix hex.key # Hex API key tasks mix hex.outdated # Shows outdated Hex deps for the current project mix hex.owner # Hex package ownership tasks mix hex.public_keys # Manages Hex public keys mix hex.publish # Publishes a new package version mix hex.registry # Hex registry tasks mix hex.search # Searches for package names mix hex.user # Hex user tasks mix loadconfig # Loads and persists the given configuration mix local # Lists local tasks mix local.hex # Installs Hex locally mix local.phoenix # Updates Phoenix locally mix local.public_keys # Manages public keys mix local.rebar # Installs rebar locally mix new # Creates a new Elixir project mix phoenix.new # Creates a new Phoenix v1.1.4 application mix profile.fprof # Profiles the given file or expression with fprof mix run # Runs the given file or expression mix test # Runs a project's tests iex -S mix # Starts IEx and run the default task
  • 36. Mixfile defmodule MyCoolProject.Mixfile do use Mix.Project def project do [ app: :my_cool_projet, version: "0.0.1", deps: deps ] end # Configuration for the OTP application def application do [mod: { MyCoolProject, [] }] end # Returns the list of dependencies in the format: # { :foobar, git: "https://github.com/elixir-lang/foobar.git", tag: "0.1" } # # To specify particular versions, regardless of the tag, do: # { :barbat, "~> 0.1", github: "elixir-lang/barbat" } defp deps do [ {:exactor, github: "sasa1977/exactor"}, {:"erlang-serial", github: "knewter/erlang-serial", app: false} ] end end
  • 37. DocTests defmodule MyModule do @doc ~S""" Sums two numbers ## Examples iex> MyModule.sum(1, 2) 3 """ def sum(a, b) do a + b end end $ mix test Compiled lib/my_module.ex .. Finished in 0.1 seconds (0.1s on load, 0.00s on tests) 2 tests, 0 failures Randomized with seed 307356
  • 38. OTP • OTP stands for Open Telecom Platform, but the name is misleading. OTP is not only for telecom related so!ware. • It’s a bundle that includes a large number of libraries to solve problems like state management, application discovery, failure detection, hot code swapping, and server structure . • Unfortunately, we don’t have time to talk about OTP today :/
  • 41. Phoenix Framework • MVC web framework created by Chris McCord. José Valim is working on it too. • Tastes a little bit like Ruby on Rails, but it is not. • Aims for high developer productivity and high application performance. • It has powerful abstractions for creating modern web apps in 2016, such as Channels (~ web sockets).
  • 42. Phoenix Framework • Create a new project $ mix phoenix.new hello_phoenix • Create database $ mix ecto.create • Run server $ mix phoenix.server
  • 43. Phoenix Framework • It’s actually the top layer of a multi-layer system designed to be modular and flexible. • The other layers include Plug (kind of like Ruby’s Rack), Ecto (kind of like ActiveRecord), and Cowboy, the Erlang HTTP server.
  • 44. Phoenix Framework • Thanks to the power of Elixir and the ease of use of Channels in Phoenix we can create web apps where we have 1 real time bi-directional data channel with every user (a websocket). And it scales, for real. • Despite that WebSockets are the main transport for Phoenix’s channels, it also supports other transport mechanism for old browsers or embedded devices.
  • 45. Phoenix Framework • It plays nicely with the modern front-end world (ES6) by relying on Brunch, a fast and simple asset build tool. • It’s very easy to replace Brunch by Webpack or any other hipster build tool of your choice. • Note that Brunch requires Node.js (trollface).
  • 51.
  • 53. Showcase • BSRBulb: Elixir library to control a Bluetooth Smart Bulb. https://github.com/diacode/bsr_bulb • Phoenix Trello: a Trello tribute with Phoenix & React. https://github.com/bigardone/phoenix-trello https://blog.diacode.com/trello-clone-with-phoenix-and-react-pt-1 • Phoenix Toggl: a Toggl tribute with Phoenix & React. https://github.com/bigardone/phoenix-toggl • Elixir Toggl API Wrapper https://github.com/diacode/togglex
  • 55. Next steps • Watch every talk by José Valim. Really, you won’t regret. • Books: Programming Elixir – Dave Thomas Programming Phoenix – Chris McCord, Bruce Tate & José Valim. • Elixir Getting Started Guide (really good!) http://elixir-lang.org/getting-started/introduction.html • Phoenix Guide (really good!) http://www.phoenixframework.org/docs/overview • Elixir Radar http://plataformatec.com.br/elixir-radar • Madrid |> Elixir Slack (#madrid-meetup) https://elixir-slackin.herokuapp.com/