chicago elixir - elixir intro

39
Intro to Elixir

Upload: drewolson

Post on 24-May-2015

391 views

Category:

Technology


4 download

TRANSCRIPT

Page 1: Chicago Elixir - Elixir Intro

Intro to Elixir

Page 2: Chicago Elixir - Elixir Intro

Drew Olson Braintree

Page 3: Chicago Elixir - Elixir Intro

brew install elixir

Page 4: Chicago Elixir - Elixir Intro

Functional Concurrent Immutable

Page 5: Chicago Elixir - Elixir Intro

Erlang?

Page 6: Chicago Elixir - Elixir Intro

Kind of. It’s on the Erlang VM.

Page 7: Chicago Elixir - Elixir Intro

Metaprogramming Polymorphism

Tooling

Page 8: Chicago Elixir - Elixir Intro

IO.puts "Hello, world!"

Page 9: Chicago Elixir - Elixir Intro

Types

Page 10: Chicago Elixir - Elixir Intro

1         # integer"1.0       # float":atom     # atom / symbol"{1, 2, 3} # tuple"[1, 2, 3] # list

Page 11: Chicago Elixir - Elixir Intro

[name: "Drew", age: 31]             # keyword"[{:name, "Drew"}, {:age, 31}]       # keyword

Page 12: Chicago Elixir - Elixir Intro

HashDict.new(name: "Drew", age: 31) # HashDict

Page 13: Chicago Elixir - Elixir Intro

Modules & Functions

Page 14: Chicago Elixir - Elixir Intro

defmodule Greeter do"  def greet(thing) do"    IO.puts "Hello, #{thing}!""  end"end"!

Greeter.greet("World")

Page 15: Chicago Elixir - Elixir Intro

Anonymous Functions

Page 16: Chicago Elixir - Elixir Intro

subject = "World""!

greeter = fn(greeting) ->"  IO.puts("#{greeting}, #{subject}!")"end"!

greeter.("Hello")

Page 17: Chicago Elixir - Elixir Intro

Records

Page 18: Chicago Elixir - Elixir Intro

defrecord Person,"  name: nil,"  age: nil"!

drew = Person.new(name: "Drew", age: 31)"!

IO.puts(drew.name)"IO.puts(drew.age)

Page 19: Chicago Elixir - Elixir Intro

Protocols

Page 20: Chicago Elixir - Elixir Intro

defprotocol Checker do"  @fallback_to_any true"  def person?(data)"end"!defimpl Checker, for: Person do"  def person?(_) do"    true"  end"end"!defimpl Checker, for: Any do"  def person?(_) do"    false"  end"end"!Checker.person?(Person.new)"Checker.person?(HashDict.new)

Page 21: Chicago Elixir - Elixir Intro

Enum

Page 22: Chicago Elixir - Elixir Intro

list = [1, 2, 3]"keyword = [a: 1, b: 2, c: 3]"!

Enum.map list, fn(item) ->"  item * 2"end"!

Enum.map keyword, fn({key, val}) ->"  "#{key} -> #{val}""end

Page 23: Chicago Elixir - Elixir Intro

Pattern Matching

Page 24: Chicago Elixir - Elixir Intro

list = [1, 2, 3]"!

case list do"  [head|_] ->"    IO.puts(head)"  [] ->"    IO.puts("empty!")"end

Page 25: Chicago Elixir - Elixir Intro

defmodule MyList do"  def sum(list) do"    sum(list, 0)"  end"!

  defp sum([head|rest], acc) do"    sum(rest, acc + head)"  end"!

  defp sum([], acc) do"    acc"  end"end"!

MyList.sum([1, 2, 3])

Page 26: Chicago Elixir - Elixir Intro

but really

Page 27: Chicago Elixir - Elixir Intro

Enum.reduce [1, 2, 3], fn(item, acc) ->"  acc + item"end

Page 28: Chicago Elixir - Elixir Intro

Macros

Page 29: Chicago Elixir - Elixir Intro

not today :)

Page 30: Chicago Elixir - Elixir Intro

Concurrency

Page 31: Chicago Elixir - Elixir Intro

not today ;(

Page 32: Chicago Elixir - Elixir Intro

Tooling

Page 33: Chicago Elixir - Elixir Intro

mix

Page 34: Chicago Elixir - Elixir Intro

Bundler + Rake

Page 35: Chicago Elixir - Elixir Intro

defmodule Foo.Mixfile do"  use Mix.Project"!  def project do"    [ app: :foo,"      version: "0.0.1","      elixir: "~> 0.12.2","      deps: deps ]"  end"!  # Configuration for the OTP application"  def application do"    [mod: { Foo, [] }]"  end"!  # Returns the list of dependencies in the format:"  # { :foobar, git: "https://github.com/elixir-lang/foobar.git", tag: "0.1" }"  #"  # To specify particular versions, regardless of the tag, do:"  # { :barbat, "~> 0.1", github: "elixir-lang/barbat" }"  defp deps do"    []"  end"end

Page 36: Chicago Elixir - Elixir Intro

ExUnit

Page 37: Chicago Elixir - Elixir Intro

defmodule MyListTest do"  use ExUnit.Case"!

  test "it sums" do"    assert MyList.sum([1, 2, 3]) == 6"  end"end

Page 38: Chicago Elixir - Elixir Intro

Demos

Page 39: Chicago Elixir - Elixir Intro

Thank you. Questions?