Concurrent
Distributed
Fault-tolerant
Hot swapping
Highly available
New generations
Done for web
Ruby-like
Extensibility
Tooling
Compiled to BEAM
Erlang-powered
my_mutable_values = [10]
class MyClass
def self.please_dont_modify_this(values)
# Do stuff
values.push(rand(10))
# Do more stuff
end
end
MyClass.please_dont_modify_this(my_mutable_values)
my_mutable_values # => [10, ???]
my_immutable_values = [10]
defmodule MyModule do
def please_dont_modify_this(values) do
# Do stuff
values = [ :rand.uniform(10) | values]
# Do more stuff
end
end
MyModule.please_dont_modify_this(my_immutable_values)
my_immutable_values # => [10]
my_immutable_values = [10, 20, 30, 40, 50]
defmodule MyModule do
def please_dont_modify_this(values) do
# Do stuff
other_values = [ :rand.uniform(10) | values]
# Do more stuff
end
end
MyModule.please_dont_modify_this(my_immutable_values)
my_immutable_values # => [10]
my_immutable_values = [10, 20, 30, 40, 50]
defmodule MyModule do
def please_dont_modify_this(values) do
# Do stuff
# Uses random value as head and `values` as tail
other_values = [ :rand.uniform(10) | values]
# Do more stuff
end
end
MyModule.please_dont_modify_this(my_immutable_values)
my_immutable_values # => [10]
iex(1)> a = "hola"
"hola"
iex(1)> a = "hola"
"hola"
iex(2)> "hola" = a
"hola"
iex(1)> a = "hola"
"hola"
iex(2)> "hola" = a
"hola"
iex(3)> "hello" = a
** (MatchError) no match of right hand side value: "hola"
iex(1)> list = [1, 2, 3]
[1, 2, 3]
iex(2)> [a, b, c] = list
[1, 2, 3]
iex(1)> list = [1, 2, 3]
[1, 2, 3]
iex(2)> [a, b, c] = list
[1, 2, 3]
iex(3)> a
1
iex(4)> b
2
iex(5)> c
3
iex(1)> list = [1, 2, 3]
[1, 2, 3]
iex(2)> [1, will_match, 3] = list
[1, 2, 3]
iex(1)> list = [1, 2, 3]
[1, 2, 3]
iex(2)> [1, will_match, 3] = list
[1, 2, 3]
iex(3)> [wont_match, 2, 4] = list
** (MatchError) no match of right hand side value: [1,2,3]
iex(1)> list = [1, 2, 3]
[1, 2, 3]
iex(2)> [1, will_match, 3] = list
[1, 2, 3]
iex(3)> [maybe_match, 2, 4] = list
** (MatchError) no match of right hand side value: [1,2,3]
iex(3)> [maybe_match, 2, _] = list
[1, 2, 3]
defmodule Calc do
def add(x, y), do: x + y
end
Calc.add(2,3) # 5
defmodule Calc do
def add(x, y), do: x + y
def sum(n) do
if(1 == n) do
1
else
n + sum(n-1)
end
end
end
Calc.sum(5) # 15
defmodule Calc do
def add(x, y), do: x + y
def sum(1), do: 1
def sum(n), do: n + sum(n-1)
end
Calc.sum(5) # 15
defmodule Calc do
def add(x, y), do: x + y
def sum(1), do: 1
def sum(n), do: n + sum(n-1)
end
Calc.sum(-1) # looping forever
defmodule Calc do
def add(x, y), do: x + y
def sum(n) do
if(n == 1) do
1
else
if(n > 1) do
n + sum(n-1)
end
end
end
end
Calc.sum(-1) # nil
defmodule Calc do
def add(x, y), do: x + y
def sum(1), do: 1
def sum(n) when n > 0, do: n + sum(n-1)
end
Calc.sum(-1) # no function clause matching in Calc.sum/1
defmodule Calc do
def add(x, y), do: x + y
def sum(1), do: 1
def sum(n) when n > 0, do: n + sum(n-1)
end
Calc.sum([3, 5, 7]) # no function clause matching in Calc.sum/1
defmodule Calc do
def add(x, y), do: x + y
def sum(1), do: 1
def sum(n) when is_integer(n) and n > 0, do: n + sum(n-1)
def sum([]), do: 0
def sum([ head | tail]), do: head + sum(tail)
end
Calc.sum(7) # 28
Calc.sum([3, 5, 7]) # 15
[] # []
[] # []
[3] # [3 | []]
[] # []
[3] # [3 | []]
[3, 2] # [3 | [2 | []]]
[] # []
[3] # [3 | []]
[3, 2] # [3 | [2 | []]]
[3, 2, 1] # [3 | [2 | [1 | []]]]
defmodule Calc do
def sum([]), do: 0
def sum([ head | tail]), do: head + sum(tail)
end
Calc.sum([3, 5, 7])
defmodule Calc do
def sum([]), do: 0
def sum([ head | tail]), do: head + sum(tail)
end
Calc.sum([3, 5, 7])
# 3 + sum([5 | 7])
defmodule Calc do
def sum([]), do: 0
def sum([ head | tail]), do: head + sum(tail)
end
Calc.sum([3, 5, 7])
# 3 + sum([5 | 7])
# 3 + 5 + sum([7])
defmodule Calc do
def sum([]), do: 0
def sum([ head | tail]), do: head + sum(tail)
end
Calc.sum([3, 5, 7])
# 3 + sum([5 | 7])
# 3 + 5 + sum([7])
# 3 + 5 + 7 + sum([])
defmodule Calc do
def sum([]), do: 0
def sum([ head | tail]), do: head + sum(tail)
end
Calc.sum([3, 5, 7])
# 3 + sum([5 | 7])
# 3 + 5 + sum([7])
# 3 + 5 + 7 + sum([])
# 3 + 5 + 7 + 0
defmodule Calc do
def sum([]), do: 0
def sum([ head | tail]), do: head + sum(tail)
end
Calc.sum([3, 5, 7]) # 15
# 3 + sum([5 | 7])
# 3 + 5 + sum([7])
# 3 + 5 + 7 + sum([])
# 3 + 5 + 7 + 0