2. Elixir
José Valim - co-fondateur de Plataformatec
(http://plataformatec.com.br)
Proposer la puissance de la machine virtuelle Erlang
d’une manière différente aux développeurs.
Premier commit date de janvier 2011
Version actuelle : 0.10.2 / 0.10.3-dev
Release finale est prévue pour juin 2014
4. Les variables
Erlang :
• /^(?:_[a-zA-Z0-9_]|[A-Z])[a-zA-Z0-9_]*$/
• single assignment
Elixir :
• /^(?:_[a-zA-Z0-9_]|[a-z])[a-zA-Z0-9_]*$/
• re assignment
5. Erlang :
1> A = [1, 2, 3].
[1, 2, 3]
2> A = [4, 5, 6].
** exception error: no match of right hand side value [4,5,6]
Elixir :
iex(1)> a = [1, 2, 3]
[1, 2, 3]
iex(2)> a = [4, 5, 6]
[4, 5, 6]
Les variables
6. iex(1)> a = [1, 2, 3]
[1, 2, 3]
iex(2)> [b, c, d] = a
[1, 2, 3]
iex(3)> b
1
iex(4)> c
2
iex(4)> d
3
7. iex(1)> a = [1, 2, 3]
[1, 2, 3]
iex(2)> [b | tail] = a
[1, 2, 3]
iex(3)> b
1
iex(4)> tail
[2, 3]
22. <<2.4>>
<<2.4:float>> =
<<64, 3, 51, 51, 51, 51, 51, 51>>
** (ArgumentError) argument error
:erl_eval.expr/3
les flottants sont codés sur 64 bits ; le premier bit pour
coder le signe, les 11 suivants pour l’exposant, puis 52
bits pour la mantisse et le dernier, implicite.
24. defmodule Test do
def circle(t) do
[x|tail] = t
tail ++ [x]
end
end
Test.circle [1, 2, 3]
# => [2, 3, 1]
25. defmodule Test do
def circle(t) do
[x|tail] = t
tail ++ [x]
end
end
Test.circle "123"
** (MatchError) no match of right
hand side value: "123"
26. defmodule Test do
def circle(t) when is_list(t) do
[x|tail] = t
tail ++ [x]
end
end
Test.circle [1, 2, 3]
# => [2, 3, 1]
27. defmodule Test do
def circle(t) when is_list(t) do
[x|tail] = t
tail ++ [x]
end
end
Test.circle "123"
** (FunctionClauseError) no function
clause matching in Test.circle/1
28. defmodule Test do
def circle([x|tail]) do
tail ++ [x]
end
end
Test.circle [1, 2, 3]
# => [2, 3, 1]
29. defmodule Test do
def circle([x|tail]) do
tail ++ [x]
end
end
Test.circle "123"
** (FunctionClauseError) no function
clause matching in Test.circle/1
31. defprotocol Test do
def circle(l)
end
defimpl Test, for: List do
def circle(l) do
[x|tail] = l
tail ++ [x]
end
end
32. defprotocol Test do
def circle(l)
end
defimpl Test, for: List do
def circle(l) do
[x|tail] = l
tail ++ [x]
end
end
Test.circle([1, 2, 3])
#=> [2, 3, 1]
36. defmodule Test do
defmacro times(n, body) do
quote do:
Enum.each(
1..unquote(n),
fn(_) -> unquote(body) end
)
end
end
require Test
Test.times(10) do
IO.puts "hello"
end
# => hello 10 times
37. Process
defmodule Math do
def sum do
receive do
{:sum, a, b} ->
IO.puts "#{a} + #{b} = #{a+b}"
sum()
_ -> IO.puts "not implemented!"
end
end
end
pid = spawn(fn -> Math.sum end)
pid <- {:sum, 4, 7}
# => 4 + 7 = 11
pid <- {:mult, 4, 7}
# => not implemented!
38. |>
x = [1, 2, 3, 4]
x = Enum.filter(x, fn(e) -> rem(e, 2) == 0 end)
x = Enum.reduce(x, 0, fn(e, r) -> e + r end)
39. |>
x = [1, 2, 3, 4]
x = Enum.filter(x, fn(e) -> rem(e, 2) == 0 end)
x = Enum.reduce(x, 0, fn(e, r) -> e + r end)
x = [1, 2, 3, 4]
|> Enum.filter(fn(e) -> rem(e, 2) == 0 end)
|> Enum.reduce(0, fn(e, r) -> e + r end)
40. |>
x = [1, 2, 3, 4]
x = Enum.filter(x, fn(e) -> rem(e, 2) == 0 end)
x = Enum.reduce(x, 0, fn(e, r) -> e + r end)
x = [1, 2, 3, 4]
|> Enum.filter(fn(e) -> rem(e, 2) == 0 end)
|> Enum.reduce(0, fn(e, r) -> e + r end)
x = [1, 2, 3, 4]
|> Enum.filter(&(rem(&1, 2) == 0))
|> Enum.reduce(0, &(&1 + &2))