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.

Ff2c33d63aa8e06c90f4638c6266b4fb?s=128

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 hello@sheharyar.me