Top Banner
E lang Elixir |>
44

Elixir @ Paris.rb

Jun 22, 2015

Download

Technology

Short Elixir presentation
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Elixir @ Paris.rb

E!lang Elixir|>

Page 2: Elixir @ Paris.rb

Elixir

José Valim - co-fondateur de Plataformatec(http://plataformatec.com.br)

Proposer la puissance de la machine virtuelle E!lang d’une manière différente aux développeurs.

Premier commit date de janvier 2011Version actuelle : 0.10.2 / 0.10.3-devRelease finale est prévue pour juin 2014

Page 3: Elixir @ Paris.rb

E!lang : wget http://www.erlang.org/download/otp_src_R16B02.tar.gztar zxf otp_src_R16B02.tar.gzcd otp_src_R16B02./configuremakesudo make install

Elixir :git clone https://github.com/elixir-lang/elixir.gitcd elixirmakesudo make install

Page 4: Elixir @ Paris.rb

Les variablesE!lang :

• /^(?:_[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

Page 5: Elixir @ Paris.rb

E!lang :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

Page 6: Elixir @ Paris.rb

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

Page 7: Elixir @ Paris.rb

iex(1)> a = [1, 2, 3][1, 2, 3]iex(2)> [b | tail] = a[1, 2, 3]iex(3)> b1iex(4)> tail[2, 3]

Page 8: Elixir @ Paris.rb

atomes:an_atom

:"an atom!"

booléenstruefalse

listes [104,101,108,108,111] = ‘hello’

tuples {1, :tuple, ‘de’, "données"}

Page 9: Elixir @ Paris.rb

fonctionsmy_fun = fn(x) -> x*x end

my_fun.(3)

regex %r/erlang|elixir/

range [1..10]

hash[key1: "value1", key2: 3, ...][{"Une clé", "sa valeur»}, ...]

Page 10: Elixir @ Paris.rb

Les binaires : séquence d’entiers (0-255 / 8 bits) placée entre << et >>

Page 11: Elixir @ Paris.rb

Les binaires : séquence d’entiers (0-255 / 8 bits) placée entre << et >>

<<104, 101, 108, 108, 111>>

Page 12: Elixir @ Paris.rb

Les binaires : séquence d’entiers (0-255 / 8 bits) placée entre << et >>

<<[104, 101, 108, 108, 111]>>

<<104, 101, 108, 108, 111>>

Page 13: Elixir @ Paris.rb

Les binaires : séquence d’entiers (0-255 / 8 bits) placée entre << et >>

<<[104, 101, 108, 108, 111]>>

<<'hello'>>

<<104, 101, 108, 108, 111>>

Page 14: Elixir @ Paris.rb

Les binaires : séquence d’entiers (0-255 / 8 bits) placée entre << et >>

<<[104, 101, 108, 108, 111]>>

<<'hello'>>

"hello"

<<104, 101, 108, 108, 111>>

Page 15: Elixir @ Paris.rb

<<259>> = ?

Page 16: Elixir @ Paris.rb

<<259>> = <<3>>

Page 17: Elixir @ Paris.rb

<<259>> = <<3>>

<<259:size(16)>> = <<1, 3>>

Page 18: Elixir @ Paris.rb

<<259>> = <<3>>

<<259:size(16)>> = <<1, 3>>

<<x:size(16)>> = <<1, 3>>

Page 19: Elixir @ Paris.rb

<<2.4>>

Page 20: Elixir @ Paris.rb

<<2.4>>** (ArgumentError) argument error :erl_eval.expr/3

Page 21: Elixir @ Paris.rb

<<2.4>>

<<2.4:float>> = <<64, 3, 51, 51, 51, 51, 51, 51>>

** (ArgumentError) argument error :erl_eval.expr/3

Page 22: Elixir @ Paris.rb

<<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.

Page 23: Elixir @ Paris.rb

binary, bits, bitstring, bytes, float, integer, utf8, utf16, utf32

signed, unsigned

iex(1)> <<f::float, i::[size(32), signed]>> = <<64, 6, 102, 102, 102, 102, 102, 102, 255, 255, 254, 195>><<64, 6, 102, 102, 102, 102, 102, 102, 255, 255, 254, 195>>iex(2)> f2.8iex(3)> i-317

Page 24: Elixir @ Paris.rb

defmodule Test do def circle(t) do [x|tail] = t tail ++ [x] endend

Test.circle [1, 2, 3]# => [2, 3, 1]

Page 25: Elixir @ Paris.rb

defmodule Test do def circle(t) do [x|tail] = t tail ++ [x] endend

Test.circle "123"** (MatchError) no match of right hand side value: "123"

Page 26: Elixir @ Paris.rb

defmodule Test do def circle(t) when is_list(t) do [x|tail] = t tail ++ [x] endend

Test.circle [1, 2, 3]# => [2, 3, 1]

Page 27: Elixir @ Paris.rb

defmodule Test do def circle(t) when is_list(t) do [x|tail] = t tail ++ [x] endend

Test.circle "123"** (FunctionClauseError) no function clause matching in Test.circle/1

Page 28: Elixir @ Paris.rb

defmodule Test do def circle([x|tail]) do

tail ++ [x] endend

Test.circle [1, 2, 3]# => [2, 3, 1]

Page 29: Elixir @ Paris.rb

defmodule Test do def circle([x|tail]) do

tail ++ [x] endend

Test.circle "123"** (FunctionClauseError) no function clause matching in Test.circle/1

Page 30: Elixir @ Paris.rb

defprotocol Test do def circle(l)end

Page 31: Elixir @ Paris.rb

defprotocol Test do def circle(l)end

defimpl Test, for: List do def circle(l) do [x|tail] = l tail ++ [x] endend

Page 32: Elixir @ Paris.rb

defprotocol Test do def circle(l)end

defimpl Test, for: List do def circle(l) do [x|tail] = l tail ++ [x] endend

Test.circle([1, 2, 3])#=> [2, 3, 1]

Page 33: Elixir @ Paris.rb

Test.circle("123")** (UndefinedFunctionError) undefined function: Test.BitString.circle/1

Page 34: Elixir @ Paris.rb

Test.circle("123")** (UndefinedFunctionError) undefined function: Test.BitString.circle/1

defimpl Test, for: BitString do def circle(l) do [x|tail] = String.to_char_list!(l) list_to_bitstring(tail ++ [x]) endend

Page 35: Elixir @ Paris.rb

Test.circle("123")** (UndefinedFunctionError) undefined function: Test.BitString.circle/1

defimpl Test, for: BitString do def circle(l) do [x|tail] = String.to_char_list!(l) list_to_bitstring(tail ++ [x]) endend

Test.circle("123")#=> "231"

Page 36: Elixir @ Paris.rb

defmodule Test do defmacro times(n, body) do quote do: Enum.each( 1..unquote(n), fn(_) -> unquote(body) end ) endend

require TestTest.times(10) do IO.puts "hello"end# => hello 10 times

Page 37: Elixir @ Paris.rb

P!ocessdefmodule Math do def sum do receive do {:sum, a, b} -> IO.puts "#{a} + #{b} = #{a+b}" sum() _ -> IO.puts "not implemented!" end endend

pid = spawn(fn -> Math.sum end)pid <- {:sum, 4, 7}# => 4 + 7 = 11pid <- {:mult, 4, 7}# => not implemented!

Page 38: Elixir @ Paris.rb

|>

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)

Page 39: Elixir @ Paris.rb

|>

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)

Page 40: Elixir @ Paris.rb

|>

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))

Page 41: Elixir @ Paris.rb

Mix

mix new my_appcd my_appmix deps.getmix compilemix test

Page 42: Elixir @ Paris.rb

Web

• cowboy : http://ninenines.eu

• dynamo : https://github.com/elixir-lang/dynamo

• weber : http://0xax.github.io/weber/

Page 43: Elixir @ Paris.rb

Resources

http://elixir-lang.org

https://github.com/glejeune/ews

Page 44: Elixir @ Paris.rb