Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Introduction to Elixir

Introduction to Elixir

My talk on Elixir that I delivered at IslamabadJS.

Sheharyar Naseer

February 27, 2016
Tweet

More Decks by Sheharyar Naseer

Other Decks in Programming

Transcript

  1. ELIXIR INTRODUCTION TO

  2. SHEHARYAR NASEER sheharyarn

  3. STORY TIME

  4. - Rails is Immensely Popular - Developer productivity is through

    the roof - But has concurrency issues - José Valim to make it threadsafe BACK IN THE DAY
  5. - Can never fully guarantee it - Looked towards Functional

    Languages - Erlang! THREADSAFE RAILS
  6. - Fast and Powerful - Immutable - Fault-tolerant - Concurrent

    and Distributed ERLANG-LOVE
  7. JOSÉ VALIM I liked everything I saw in Erlang, but

    hated the things I didn’t see “
  8. - Awful Syntax - Lack of Metaprogramming - No Polymorphism

    - No proper build tools ERLANG-HATE
  9. Decided to build his own language on the ERLANG VM

  10. ELIXIR IS BORN

  11. ELIXIR-LANG.COM A dynamic, functional language designed for building scalable and

    maintainable applications “
  12. $ brew install elixir $ iex iex> IO.puts "hello world!"

    hello world! GETTING STARTED
  13. 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
  14. 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
  15. 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
  16. 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
  17. 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
  18. 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
  19. 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
  20. iex> x = 10 10 iex> 10 = x 10

    PATTERN MATCHING
  21. iex> x = 10 10 iex> 10 = x 10

    iex> 20 = x ** (MatchError) no match of right hand side value: 10 PATTERN MATCHING
  22. iex> {a, b, c} = {"horror", :friday, 13} iex> a

    # => "horror" iex> b # => :friday iex> c # => 13 PATTERN MATCHING
  23. 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
  24. 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
  25. 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
  26. defmodule Area do def rectangle(l, w) do l * w

    end end iex> Area.rectangle(2, 3) 6 MODULES
  27. 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
  28. 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
  29. 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
  30. 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
  31. # 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
  32. # 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
  33. # 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
  34. 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
  35. METAPROGRAMMING - via Macros - Elixir is written in Elixir!

    - Almost everything is a Macro def, defmodule, if-else, and, or, !, |>, and so much more
  36. defmacro macro_unless(clause, expression) do quote do if(!unquote(clause), do: unquote(expression)) end

    end METAPROGRAMMING
  37. $ mix new my_app $ mix deps.get $ mix test

    $ mix run $ iex -S mix MIX
  38. THE FUTURE

  39. - Growing at an amazing rate - Backed by major

    players from Rails, Erlang & Node.js communities - Erlang libraries at disposal COMMUNITY
  40. - Elixir’s Rails - Super-fast and developer-friendly - Requests completed

    in microseconds (µs) - Tons of guides and resources already available PHOENIX FRAMEWORK
  41. - PHP with Open Source - Rails with Developer Productivity

    - Elixir with Performance
 (without sacrificing developer happiness) THE NEXT REVOLUTION
  42. - Official Website (elixir-lang.com) - Awesome Books - Elixir in

    Action - Programming Elixir - Screencasts - Elixir Sips (elixirsips.com) - Learn Elixir (learnelixir.tv) RESOURCES
  43. QUESTIONS? sheharyarn [email protected]