Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Introduction to Elixir
Search
Sheharyar Naseer
February 27, 2016
Programming
3
1.5k
Introduction to Elixir
My talk on Elixir that I delivered at IslamabadJS.
Sheharyar Naseer
February 27, 2016
Tweet
Share
More Decks by Sheharyar Naseer
See All by Sheharyar Naseer
AI Seekho - Google Cloud Study Jam 2025
sheharyar
0
68
Thinking in Environments with Docker
sheharyar
0
59
FLAME - Better Serverless Architecture with Kubernetes
sheharyar
1
100
Supercharging Development with Docker
sheharyar
0
280
Using Docker for your Applications
sheharyar
1
220
Building LLM Apps with Google Vertex AI and PaLM
sheharyar
0
400
Cloud Basics: Google App Engine
sheharyar
0
310
Docker on Google Cloud
sheharyar
0
530
Self-Paced GCP for Students
sheharyar
1
360
Other Decks in Programming
See All in Programming
Contribute to Comunities | React Tokyo Meetup #4 LT
sasagar
0
590
iOSアプリで測る!名古屋駅までの 方向と距離
ryunakayama
0
150
状態と共に暮らす:ステートフルへの挑戦
ypresto
3
1.1k
ニーリーQAのこれまでとこれから
nealle
2
160
Flutterでllama.cppをつかってローカルLLMを試してみた
sakuraidayo
0
120
Empowering Developers with HTML-Aware ERB Tooling @ RubyKaigi 2025, Matsuyama, Ehime
marcoroth
2
950
Thank you <💅>, What's the Next?
ahoxa
1
590
カオスに立ち向かう小規模チームの装備の選択〜フルスタックTSという装備の強み _ 弱み〜/Choosing equipment for a small team facing chaos ~ Strengths and weaknesses of full-stack TS~
bitkey
1
130
UMAPをざっくりと理解 / Overview of UMAP
kaityo256
PRO
3
1.4k
Amazon CloudWatchの地味だけど強力な機能紹介!
itotsum
0
230
Ruby on Railroad: The Power of Visualizing CFG
ydah
0
290
API for docs
soutaro
3
1.6k
Featured
See All Featured
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
160
15k
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
30
2.3k
Build your cross-platform service in a week with App Engine
jlugia
230
18k
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
3.8k
Speed Design
sergeychernyshev
29
920
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
29
9.4k
Building a Modern Day E-commerce SEO Strategy
aleyda
40
7.2k
Optimising Largest Contentful Paint
csswizardry
37
3.2k
ReactJS: Keep Simple. Everything can be a component!
pedronauck
667
120k
Code Reviewing Like a Champion
maltzj
523
40k
Designing Experiences People Love
moore
142
24k
Building Flexible Design Systems
yeseniaperezcruz
329
39k
Transcript
ELIXIR INTRODUCTION TO
SHEHARYAR NASEER sheharyarn
STORY TIME
- Rails is Immensely Popular - Developer productivity is through
the roof - But has concurrency issues - José Valim to make it threadsafe BACK IN THE DAY
- Can never fully guarantee it - Looked towards Functional
Languages - Erlang! THREADSAFE RAILS
- Fast and Powerful - Immutable - Fault-tolerant - Concurrent
and Distributed ERLANG-LOVE
JOSÉ VALIM I liked everything I saw in Erlang, but
hated the things I didn’t see “
- Awful Syntax - Lack of Metaprogramming - No Polymorphism
- No proper build tools ERLANG-HATE
Decided to build his own language on the ERLANG VM
ELIXIR IS BORN
ELIXIR-LANG.COM A dynamic, functional language designed for building scalable and
maintainable applications “
$ brew install elixir $ iex iex> IO.puts "hello world!"
hello world! GETTING STARTED
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
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
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
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
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
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
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
iex> x = 10 10 iex> 10 = x 10
PATTERN MATCHING
iex> x = 10 10 iex> 10 = x 10
iex> 20 = x ** (MatchError) no match of right hand side value: 10 PATTERN MATCHING
iex> {a, b, c} = {"horror", :friday, 13} iex> a
# => "horror" iex> b # => :friday iex> c # => 13 PATTERN MATCHING
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
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
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
defmodule Area do def rectangle(l, w) do l * w
end end iex> Area.rectangle(2, 3) 6 MODULES
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
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
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
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
# 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
# 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
# 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
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
METAPROGRAMMING - via Macros - Elixir is written in Elixir!
- Almost everything is a Macro def, defmodule, if-else, and, or, !, |>, and so much more
defmacro macro_unless(clause, expression) do quote do if(!unquote(clause), do: unquote(expression)) end
end METAPROGRAMMING
$ mix new my_app $ mix deps.get $ mix test
$ mix run $ iex -S mix MIX
THE FUTURE
- Growing at an amazing rate - Backed by major
players from Rails, Erlang & Node.js communities - Erlang libraries at disposal COMMUNITY
- Elixir’s Rails - Super-fast and developer-friendly - Requests completed
in microseconds (µs) - Tons of guides and resources already available PHOENIX FRAMEWORK
- PHP with Open Source - Rails with Developer Productivity
- Elixir with Performance (without sacrificing developer happiness) THE NEXT REVOLUTION
- Official Website (elixir-lang.com) - Awesome Books - Elixir in
Action - Programming Elixir - Screencasts - Elixir Sips (elixirsips.com) - Learn Elixir (learnelixir.tv) RESOURCES
QUESTIONS? sheharyarn
[email protected]