Slide 1

Slide 1 text

ELIXIR INTRODUCTION TO

Slide 2

Slide 2 text

SHEHARYAR NASEER sheharyarn

Slide 3

Slide 3 text

STORY TIME

Slide 4

Slide 4 text

- Rails is Immensely Popular - Developer productivity is through the roof - But has concurrency issues - José Valim to make it threadsafe BACK IN THE DAY

Slide 5

Slide 5 text

- Can never fully guarantee it - Looked towards Functional Languages - Erlang! THREADSAFE RAILS

Slide 6

Slide 6 text

- Fast and Powerful - Immutable - Fault-tolerant - Concurrent and Distributed ERLANG-LOVE

Slide 7

Slide 7 text

JOSÉ VALIM I liked everything I saw in Erlang, but hated the things I didn’t see “

Slide 8

Slide 8 text

- Awful Syntax - Lack of Metaprogramming - No Polymorphism - No proper build tools ERLANG-HATE

Slide 9

Slide 9 text

Decided to build his own language on the ERLANG VM

Slide 10

Slide 10 text

ELIXIR IS BORN

Slide 11

Slide 11 text

ELIXIR-LANG.COM A dynamic, functional language designed for building scalable and maintainable applications “

Slide 12

Slide 12 text

$ brew install elixir $ iex iex> IO.puts "hello world!" hello world! GETTING STARTED

Slide 13

Slide 13 text

iex> 99 # integer iex> 4.2 # float iex> true # boolean iex> :atom # atom iex> "i ♥ elixir" # string iex> [1, 2, 3] # list iex> {4, 5, 6} # tuple BASIC TYPES

Slide 14

Slide 14 text

iex> 10 + 3 => 13 iex> 10 / 5 => 2.0 iex> "hello" <> " world" => "hello world" iex> "num: #{4 * 5}" => "num: 20" iex> true and false => false iex> nil || :something => :something iex> [1, 2, 3] ++ [4, 5] => [1, 2, 3, 4, 5] iex> [1, 2, 3] —- [2] => [1, 3] BASIC OPERATORS

Slide 15

Slide 15 text

iex> double = fn x -> x * 2 end iex> double.(7) 14 iex> Enum.map [1,2,3,4,5], double [2, 4, 6, 8, 10] HIGHER ORDER FUNCTIONS

Slide 16

Slide 16 text

iex> person = %{name: "Sheharyar", occupation: :developer} iex> person.name # => "Sheharyar" iex> person[:occupation] # => :developer iex> person[:other] # => nil iex> person.other # => ** (KeyError) key :other not found MAPS & KEYWORD LISTS

Slide 17

Slide 17 text

iex> keywords = [{:a, 1}, {:b, 2}, {:c, 3}] [a: 1, b: 2, c: 3] iex> keywords[:b] 2 iex> keywords = [a: 1, b: 2, a: :something_else] [a: 1, b: 2, a: :something_else] MAPS & KEYWORD LISTS

Slide 18

Slide 18 text

iex> my_list = [1, 2, 3, 4, 5] iex> List.delete(my_list, 4) [1, 2, 3, 5] iex> my_list [1, 2, 3, 4, 5] IMMUTABILITY

Slide 19

Slide 19 text

iex> my_list = [1, 2, 3, 4, 5] iex> my_list = List.delete(my_list, 4) [1, 2, 3, 5] iex> my_list [1, 2, 3, 5] IMMUTABILITY

Slide 20

Slide 20 text

iex> x = 10 10 iex> 10 = x 10 PATTERN MATCHING

Slide 21

Slide 21 text

iex> x = 10 10 iex> 10 = x 10 iex> 20 = x ** (MatchError) no match of right hand side value: 10 PATTERN MATCHING

Slide 22

Slide 22 text

iex> {a, b, c} = {"horror", :friday, 13} iex> a # => "horror" iex> b # => :friday iex> c # => 13 PATTERN MATCHING

Slide 23

Slide 23 text

some_data = [:fire, {32, 45, 73}, %{name: "Foo", desc: "Bar"}] iex> [_, {a, b, _}, %{name: name}] = some_data iex> a # => 32 iex> b # => 45 iex> name # => "Foo" iex> _ # => ** (CompileError) iex: unbound variable _ PATTERN MATCHING

Slide 24

Slide 24 text

some_data = [:fire, {32, 45, 73}, %{name: "Foo", desc: "Bar"}] iex> [:water, {a, b, _}, %{name: name}] = some_data ** (MatchError) no match of right hand side value PATTERN MATCHING

Slide 25

Slide 25 text

result = Directory.read_filenames() case result do {:ok, files} -> Enum.map(files, &IO.puts/1) {:error, message} -> IO.puts "Can't read files: #{message}" end PATTERN MATCHING

Slide 26

Slide 26 text

defmodule Area do def rectangle(l, w) do l * w end end iex> Area.rectangle(2, 3) 6 MODULES

Slide 27

Slide 27 text

defmodule Area do def rectangle(l, w), do: l * w def square(l), do: rectangle(l, l) def circle(r), do: 3.14 * square(r) end Area.square(4) # => 16 Area.circle(5) # => 78.5 MODULES

Slide 28

Slide 28 text

iex> circle_radii = [1, 2, 3] iex> Enum.map circle_radii, fn r -> Area.circle(r) end [3.14, 12.56, 28.26] CAPTURE OPERATOR

Slide 29

Slide 29 text

iex> circle_radii = [1, 2, 3] iex> Enum.map circle_radii, fn r -> Area.circle(r) end [3.14, 12.56, 28.26] iex> Enum.map circle_radii, &Area.circle/1 [3.14, 12.56, 28.26] CAPTURE OPERATOR

Slide 30

Slide 30 text

defmodule Rectangle do defstruct [:length, :width] def area(rect), do: rect.length * rect.width end iex> rect = %Rectangle{length: 10, width: 5} iex> Rectangle.area(rect) 50 STRUCTS

Slide 31

Slide 31 text

# Double, reverse and then print items in a list my_list = [1, 2, 3, 4, 5] doubled_list = Enum.map(my_list, fn x -> x * 2 end) reverse_list = Enum.reverse(doubled_list) Enum.map(reverse_list, &IO.puts/1) PIPE OPERATOR

Slide 32

Slide 32 text

# Double, reverse and then print items in a list Enum.map( Enum.reverse( Enum.map([1, 2, 3, 4, 5], fn x -> x * 2 end) ), &IO.puts/1 ) PIPE OPERATOR

Slide 33

Slide 33 text

# Double, reverse and then print items in a list [1, 2, 3, 4, 5] |> Enum.map(fn x -> x*2 end) |> Enum.reverse |> Enum.map(&IO.puts/1) PIPE OPERATOR

Slide 34

Slide 34 text

defprotocol JSON do def encode(item) end POLYMORPHISM defimpl JSON, for: String do def encode(s), do: "\"#{s}\"" end defimpl JSON, for: CustomModule do def encode(item) do # do something end end

Slide 35

Slide 35 text

METAPROGRAMMING - via Macros - Elixir is written in Elixir! - Almost everything is a Macro def, defmodule, if-else, and, or, !, |>, and so much more

Slide 36

Slide 36 text

defmacro macro_unless(clause, expression) do quote do if(!unquote(clause), do: unquote(expression)) end end METAPROGRAMMING

Slide 37

Slide 37 text

$ mix new my_app $ mix deps.get $ mix test $ mix run $ iex -S mix MIX

Slide 38

Slide 38 text

THE FUTURE

Slide 39

Slide 39 text

- Growing at an amazing rate - Backed by major players from Rails, Erlang & Node.js communities - Erlang libraries at disposal COMMUNITY

Slide 40

Slide 40 text

- Elixir’s Rails - Super-fast and developer-friendly - Requests completed in microseconds (µs) - Tons of guides and resources already available PHOENIX FRAMEWORK

Slide 41

Slide 41 text

- PHP with Open Source - Rails with Developer Productivity - Elixir with Performance
 (without sacrificing developer happiness) THE NEXT REVOLUTION

Slide 42

Slide 42 text

- Official Website (elixir-lang.com) - Awesome Books - Elixir in Action - Programming Elixir - Screencasts - Elixir Sips (elixirsips.com) - Learn Elixir (learnelixir.tv) RESOURCES

Slide 43

Slide 43 text

QUESTIONS? sheharyarn [email protected]