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
Pinball Elixir
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
Adrian Dunston
October 14, 2019
Technology
120
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Pinball Elixir
Intro to Elixir with Pinball
Adrian Dunston
October 14, 2019
More Decks by Adrian Dunston
See All by Adrian Dunston
The Deal: QA and Dev Together (Triagile 2021)
apdunston
0
57
The Annotated Meeting - An Exciting New Tool for Leading Dialogue and Building Consensus (Triagile 2021)
apdunston
1
85
Tester at the Table and the Tester in my Head (Abstractions 2019)
apdunston
0
54
The Deal: Quality and Development Together
apdunston
0
270
The Tester at the Table and the Tester in my Head
apdunston
0
200
Other Decks in Technology
See All in Technology
Oracle Exadata Database Service on Cloud@Customer X11M (ExaDB-C@C) サービス概要
oracle4engineer
PRO
2
8.4k
AIと共生する開発者プラットフォーム:バクラクのモノレポ×マイクロサービス基盤
sakajunquality
2
3.9k
Terraform共通モジュールをチーム横断で“変えられる”運用へ ― リリースと適用の分離
kekke_n
1
3.4k
SRE依存からの脱却 運用を開 発チームへ移す、 フルサイ クル開 発体制の実践
joooee0000
0
3.2k
【Claude Code】鹿野さんに聞く 私の推しの並行開発環境 大公開 / claude-code-parallel-2026-07-15
tonkotsuboy_com
12
8.7k
SRE Next 2026 何でも屋からの脱却
bto
0
980
穢れた技術選定について
watany
17
5.6k
壊して学ぶAWS CDK: そのcdk deployで消えるもの、残るもの
k_adachi_01
1
410
企業でAWS Organizationsを動かすための組織設計の考え方
nrinetcom
PRO
1
110
世界、断片、モデル。そして理解
ardbeg1958
1
130
発表と総括 / Presentations and Summary
ks91
PRO
0
140
AI Driven AI Governance
pict3
0
490
Featured
See All Featured
How to build a perfect <img>
jonoalderson
1
5.8k
The Power of CSS Pseudo Elements
geoffreycrofte
82
6.4k
Winning Ecommerce Organic Search in an AI Era - #searchnstuff2025
aleyda
1
2.1k
Effective software design: The role of men in debugging patriarchy in IT @ Voxxed Days AMS
baasie
0
450
Mobile First: as difficult as doing things right
swwweet
225
10k
エンジニアに許された特別な時間の終わり
watany
108
250k
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
9
1.4k
Organizational Design Perspectives: An Ontology of Organizational Design Elements
kimpetersen
PRO
1
770
Game over? The fight for quality and originality in the time of robots
wayneb77
1
220
The Illustrated Children's Guide to Kubernetes
chrisshort
51
53k
How STYLIGHT went responsive
nonsquared
100
6.2k
A Tale of Four Properties
chriscoyier
163
24k
Transcript
Pinball Elixir with Adrian P. Dunston
@bitcapulet Purpose To get you excited about Elixir. 2
@bitcapulet Purpose To get you excited about Elixir. So you’ll
be more powerful. 3
@bitcapulet Purpose To get you excited about Elixir. So you’ll
be more powerful. So your companies will start using it. 4
@bitcapulet Purpose To get you excited about Elixir. So you’ll
be more powerful. So your companies will start using it. So my friends and I have more Elixir jobs available. 5
@bitcapulet Purpose To get you excited about Elixir. So you’ll
be more powerful. So your companies will start using it. So my friends and I have more Elixir jobs available. Because I'm excited about Elixir. 6
@bitcapulet Story Time! 7
@bitcapulet Story Time! Kevin McAbee 8
@bitcapulet
@bitcapulet
@bitcapulet
@bitcapulet Story Time! Kevin McAbee 12
@bitcapulet13
@bitcapulet14
@bitcapulet15
@bitcapulet16
Adrian P. Dunston
[email protected]
@bitcapulet 17 joinpapa.com
18 Adrian P. Dunston
[email protected]
@bitcapulet 18 joinpapa.com
@bitcapulet What is essential? 19
@bitcapulet State complexity clearly. Steal from telephony. 20
@bitcapulet Elixir does two things very well. 21
@bitcapulet If you state your complexity clearly, it's easier to
solve complex problems. 22
@bitcapulet If you state your complexity clearly, it's easier to
solve complex problems. Distributed systems = complex problems 23
@bitcapulet If you state your complexity clearly, it's easier to
solve complex problems. Functional programming forces this. 24
@bitcapulet If you state your complexity clearly, it's easier to
solve complex problems. This is what ELIXIR brings to the table. 25
@bitcapulet Rob those phone companies blind! 26
@bitcapulet Rob those phone companies blind! 16 years of searching
and building. 27
@bitcapulet Rob those phone companies blind! 16 years of searching
and building. THEN 20 years of open-source improvements. 28
@bitcapulet Rob those phone companies blind! 16 years of searching
and building. THEN 20 years of open-source improvements. 29 Now a fresh new language built on top!
@bitcapulet State complexity clearly. 30
@bitcapulet State complexity clearly. Steal from telephony. 31
@bitcapulet Magic Matching State complexity clearly. 32
@bitcapulet33
@bitcapulet34
@bitcapulet35
@bitcapulet36
@bitcapulet37
@bitcapulet38
@bitcapulet39
@bitcapulet40
@bitcapulet41
@bitcapulet42
@bitcapulet 42 43
@bitcapulet 'a' 44
@bitcapulet [1,2] 45
@bitcapulet :ok 46
@bitcapulet :ok ? 47
@bitcapulet :ok :oj :ol 48
@bitcapulet :ok :oj :ol :error :erroq :erros :adrian :adriam :adriao
49
@bitcapulet50
@bitcapulet51
@bitcapulet Plunger 52
@bitcapulet Plunger 53
@bitcapulet Plunger Playfield 54
@bitcapulet Plunger Playfield 55
@bitcapulet Plunger Playfield 56
@bitcapulet Plunger Playfield Drain 57
@bitcapulet Plunger Playfield Drain 58
@bitcapulet def run(ball) do ball end 59
@bitcapulet def run(ball) do ball; end 60
@bitcapulet def run(ball) do return ball; end 61
@bitcapulet def run(ball) do ball end Drain 62
@bitcapulet63
@bitcapulet64
@bitcapulet65
@bitcapulet66
@bitcapulet def run(a,b,c,d) do # ummm... end 67
@bitcapulet def run(a,b,c,d) do [d,c,b,a] end 68
@bitcapulet69
@bitcapulet def run(a,b,c,d) do [d,c,b,a] end 70
@bitcapulet71
@bitcapulet72
@bitcapulet73
@bitcapulet [ , , , ] 74
@bitcapulet [ , , , ] a b c d
75
@bitcapulet [ , , , ] a b c d
def get_odd(list) do a = Enum.at(list, 0) c = Enum.at(list, 2) [a, c] end 76
@bitcapulet77
@bitcapulet [a, b, c, d] [ , , , ]
78
@bitcapulet [ , , , ] [ , , ,
] 79
@bitcapulet [ , , , ] [ , , ,
] 80
@bitcapulet [ , , , ] [ , , ,
] 81
@bitcapulet [ , , , ] [ , , ,
] 82
@bitcapulet [ , , , ] a b c d
def get_odd(list) do a = Enum.at(list, 0) c = Enum.at(list, 2) [a, c] end 83
@bitcapulet [ , , , ] a b c d
def get_odd(list) do [a, b, c, d] list [a, c] end 84
@bitcapulet [ , , , ] a b c d
def get_odd(list) do [a, _, c, _] list [a, c] end 85
@bitcapulet [ , , , ] a b c d
def get_odd(list) do [a, _b, c, _d] list [a, c] end 86
@bitcapulet Captive Ball 87
@bitcapulet Multiball!! 88
@bitcapulet Kicker 89
@bitcapulet90
@bitcapulet91
@bitcapulet %{name: "Adrian"} 92
@bitcapulet %{name: "Adrian"} jsObject = {"name": "Adrian"} 93
@bitcapulet Map<Integer,String> map = new HashMap<Integer,String>(); map.put("name","Adrian"); 94
@bitcapulet %{name: "Adrian"} 95
@bitcapulet %{ name: "Adrian", age: 40, fav_capt: "Picard" } 96
@bitcapulet human = %{ name: "Adrian", age: 40, fav_capt: "Picard"
} 97
@bitcapulet human = %{ name: "Adrian", age: 40, fav_capt: "Picard"
} 98
@bitcapulet human = %{ name: , age: , fav_capt: }
99
@bitcapulet human 100
@bitcapulet %{name: var} human 101
@bitcapulet %{name: var} human 102
@bitcapulet %{name: var} human 103
@bitcapulet %{name: var} human 104
@bitcapulet %{name: var} "Adrian" human 105
@bitcapulet def get_name(map) do %{name: var} map var end 106
@bitcapulet def get_name(map) do %{name: var} map var end get_name(%{})
107
@bitcapulet get_name(%{}) 108
@bitcapulet get_name(%{}) %{} 109
@bitcapulet %{} Cookie Monster CONFIRMED!! 110
@bitcapulet %{ } Cookie Monster CONFIRMED!! 111
@bitcapulet %{0} Cookie Monster CONFIRMED!! 112
@bitcapulet %{} Cookie Monster CONFIRMED!! 113
@bitcapulet %{*} Cookie Monster CONFIRMED!! 114
@bitcapulet %{} Cookie Monster CONFIRMED!! 115
@bitcapulet %{.} Cookie Monster CONFIRMED!! 116
@bitcapulet %{} Cookie Monster CONFIRMED!! 117
@bitcapulet %{} Me love it! 118
@bitcapulet119
@bitcapulet def get_name(map) do %{name: var} map var end get_name(%{})
120
@bitcapulet def get_name(map) do %{name: var} map var end get_name(%{})
** (MatchError) no match of right hand side value: %{} 121
@bitcapulet %{} What you mean let process fail?! 122
@bitcapulet123
@bitcapulet124
@bitcapulet def get_name(map) do %{name: var} map var end get_name(%{})
** (MatchError) no match of right hand side value: %{} 125 Not just for getting values!
@bitcapulet %{name: _, age: _, fav_capt: _ } my_map 126
@bitcapulet %{"name" => _, "age" => _, "fav.capt." => "Picard"
} my_map %{name: _, age: _, fav_capt: "Picard" } my_map 127
@bitcapulet128
@bitcapulet %{"name" => _, "age" => _, "fav.capt." => "Picard"
} my_map %{name: _, age: _, fav_capt: "Picard" } my_map 129
@bitcapulet %{"name" => _, "age" => _, "fav.capt." => "Picard"
} my_map [ %{fav_capt: "Kirk"}, %{fav_capt: "Picard"}, %{fav_capt: "Sisko"}, %{fav_capt: "Janeway"}, ] list_of_maps 130
@bitcapulet %{"name" => _, "age" => _, "fav.capt." => "Picard"
} my_map [ %{fav_capt: "Kirk"}, %{fav_capt: "Picard"}, %{fav_capt: "Sisko"}, %{fav_capt: "Janeway"}, %{fav_capt: ["Kirk", "Sisko"] ] list_of_maps_with_lists 131
@bitcapulet %{"name" => _, "age" => _, "fav.capt." => "Picard"
} my_map [ %{fav_capt: "Kirk", age: var}, %{fav_capt: "Picard"}, %{fav_capt: "Sisko"}, %{fav_capt: "Janeway"}, %{fav_capt: ["Kirk", "Sisko"] ] list_of_maps_with_lists 132
@bitcapulet [ , , , ] [ , , ,
] 133 VALUES!
@bitcapulet [ , , , ] [ , , ,
] 134 VALUES!
@bitcapulet [ , , , ] [ , , ,
] 135 VALUES!
@bitcapulet [ , , , ] [ , , ,
] 136 VALUES!
@bitcapulet [ , , , ] [ , , ,
] 137 VALUES!
@bitcapulet138 FORMATS!
@bitcapulet139 values in deep structures too!
@bitcapulet = 140
@bitcapulet >%{} Of course it equal sign! Everyone guess that!
Why you use clipart in first place? 141
@bitcapulet {:ok, "Jean-Luc Picard"} = get_fav_capt(human) 142
@bitcapulet {:ok, "Jean-Luc Picard"} = get_fav_capt(human) 143
@bitcapulet cookie = "delicious" 144
@bitcapulet cookie = "delicious" %{} Okay. This me can get
behind. 145
@bitcapulet case 2 + 2 4 -> "hurray" 3 ->
"oops" end 146
@bitcapulet case do_math(2) 4 -> "hurray" 3 -> "oops" end
147
@bitcapulet case do_math(2) 4 -> "hurray" 3 -> "oops" var
-> "Got number: #{var}" end 148
@bitcapulet case do_math(2) 4 -> "hurray" 3 -> "oops" var
-> "Got number: #{var}" end 149
@bitcapulet case do_math(2) 4 -> "hurray" 3 -> "oops" var
-> "Got number: #{var}" [1, 2, 3] -> "123 list" end 150
@bitcapulet case do_math(2) 4 -> "hurray" 3 -> "oops" var
-> "got number: #{var}" [1, 2, 3] -> "123 list" end 151
@bitcapulet case do_math(2) 4 -> "hurray" 3 -> "oops" var
-> "got number: #{var}" [1, 2, 3] -> "123 list" end [ , , , ] 1 2 3 152
@bitcapulet case do_math(2) 4 -> "hurray" 3 -> "oops" var
-> "got number: #{var}" [1, 2, 3] -> "123 list" end [ , , , ] 1 2 3 153
@bitcapulet case do_math(2) 4 -> "hurray" 3 -> "oops" var
-> "got number: #{var}" [1, 2, 3] -> "123 list" end [ , , , ] 1 2 3 154
@bitcapulet case do_math(2) 4 -> "hurray" 3 -> "oops" var
-> "got number: #{var}" [1, 2, 3] -> "123 list" end 155
@bitcapulet case 4 -> "hurray" 3 -> "oops" var ->
"got number: #{var}" [1, 2, 3] -> "123 list" end 156
@bitcapulet case 4 -> "hurray" 3 -> "oops" var ->
"got number: #{var}" [1, 2, 3] -> "123 list" end 157
@bitcapulet case 4 -> "hurray" 3 -> "oops" var ->
"got number: #{var}" [1, 2, 3] -> "123 list" end 158
@bitcapulet case 4 -> "hurray" 3 -> "oops" var ->
"got number: #{var}" [1, 2, 3] -> "123 list" end 159
@bitcapulet case 4 -> "hurray" 3 -> "oops" var ->
"got number: #{var}" [1, 2, 3] -> "123 list" end 160
@bitcapulet case 4 -> "hurray" 3 -> "oops" var ->
"got number: #{var}" [1, 2, 3] -> "123 list" end 161
@bitcapulet case 4 -> "hurray" 3 -> "oops" var ->
"got number: #{var}" [1, 2, 3] -> "123 list" end 162
@bitcapulet case 4 -> "hurray" 3 -> "oops" var ->
"got number: #{var}" [1, 2, 3] -> "123 list" end 163
@bitcapulet case 4 -> "hurray" 3 -> "oops" var ->
"got number: #{var}" [1, 2, 3] -> "123 list" end 164
@bitcapulet case 4 -> "hurray" 3 -> "oops" var ->
[1, 2, 3] -> "123 list" end 165
@bitcapulet case 4 -> "hurray" 3 -> "oops" var ->
[1, 2, 3] -> "123 list" end 166
@bitcapulet case 4 -> "hurray" 3 -> "oops" var ->
[1, 2, 3] -> "123 list" end 167
@bitcapulet case 4 -> "hurray" 3 -> "oops" var ->
[1, 2, 3] -> "123 list" end 168
@bitcapulet case 4 -> "hurray" 3 -> "oops" var ->
[1, 2, 3] -> "123 list" end 169
@bitcapulet case 4 -> "hurray" 3 -> "oops" var ->
[1, 2, 3] -> "123 list" end 170
@bitcapulet case do_math(2) 4 -> "hurray" 3 -> "oops" var
-> "got number: #{var}" [1, 2, 3] -> "123 list" end 171
@bitcapulet case do_math(2) 4 -> "hurray" 3 -> "oops" var
-> "got number: #{var}" [1, 2, 3] -> "123 list" end 172
@bitcapulet case do_math(2) 4 -> "hurray" 3 -> "oops" [1,
2, 3] -> "123 list" var -> "got number: #{var}" end 173
@bitcapulet case do_math(2) 4 -> "hurray" 3 -> "oops" [1,
2, 3] -> "123 list" var -> "got number: #{var}" end 174
@bitcapulet %{} That long section. 175
@bitcapulet %{} That long section. Me need break. 176
@bitcapulet177
@bitcapulet178
@bitcapulet179
@bitcapulet180
@bitcapulet181
@bitcapulet Beam Processes Steal from telephony. 182
@bitcapulet183
@bitcapulet184
@bitcapulet185
@bitcapulet186
@bitcapulet187
@bitcapulet188
@bitcapulet189
@bitcapulet190
@bitcapulet191
@bitcapulet192
@bitcapulet193
@bitcapulet 134 Million Processes 194
@bitcapulet 134 Million Processes 195
@bitcapulet 134 Million Processes 196
@bitcapulet 134 Million Processes 197
@bitcapulet 134 Million Processes 198
@bitcapulet 134 Million Processes 199
@bitcapulet 134 Million Processes 200
@bitcapulet 134 Million Processes 201
@bitcapulet 134 Million Processes 202
@bitcapulet 134 Million Processes 203
@bitcapulet defmodule MyModule def phil(state) do phil(state + 1) end
end 204
@bitcapulet defmodule MyModule def phil(state) do receive do value ->
IO.puts("count: " <> state) IO.puts("Phil got: " <> value) end phil(state + 1) end end 205
@bitcapulet Interactive Elixir (1.6.1) - press Ctrl+C to exit (type
h() ENTER for help) iex(1)> 206
@bitcapulet Interactive Elixir (1.6.1) - press Ctrl+C to exit (type
h() ENTER for help) iex(1)> IO.puts("Hello, world!") Hello, world! :ok iex(2)> 207
@bitcapulet iex(2)> pid = spawn(MyModule, :phil, 0) #PID<0.97.0> iex(3)> 208
@bitcapulet iex(2)> pid = spawn(MyModule, :phil, 0) #PID<0.97.0> iex(3)> Process.alive?(pid)
true iex(4)> 209
@bitcapulet iex(2)> pid = spawn(MyModule, :phil, 0) #PID<0.97.0> iex(3)> Process.alive?(pid)
true iex(4)> send(pid, "hello") count: 0 Phil got: hello "hello" iex(5)> 210
@bitcapulet iex(2)> pid = spawn(MyModule, :phil, 0) #PID<0.97.0> iex(3)> Process.alive?(pid)
true iex(4)> send(pid, "hello") count: 0 Phil got: hello "hello" iex(5)> send(pid, "hello") count: 1 Phil got: hello "hello" 211
@bitcapulet spawn receive send 212 Built right into the language!
@bitcapulet A process is a recursive function that holds state
and lives at an address with a mailbox. <0.194.0> 213
@bitcapulet >%{} We back in OO-land! 214
@bitcapulet >%{} We back in OO-land! How this not just
uglier-Java?! 215
@bitcapulet216
@bitcapulet x x 217
@bitcapulet x x x x x x x x x
x x x x x 218
@bitcapulet219
@bitcapulet220
@bitcapulet221
@bitcapulet222
@bitcapulet223
@bitcapulet224
@bitcapulet 225
@bitcapulet 226
@bitcapulet 227
@bitcapulet 228
@bitcapulet 229
@bitcapulet 230
@bitcapulet 231
@bitcapulet %{} Break time 232
@bitcapulet233
@bitcapulet234
@bitcapulet235
@bitcapulet236
@bitcapulet237
@bitcapulet Function Signatures State complexity clearly. 238
@bitcapulet def run(a,b,c,d) do [d,c,b,a] end 239
@bitcapulet def run(a,b,c,d) do [d,c,b,a] end 240 Uneven
@bitcapulet def run(list) do [a,b,c,d] = list [d,c,b,a] end 241
@bitcapulet def run(list) do [a,b,c,d] = list [d,c,b,a] end 242
What if > 4 items?
@bitcapulet run([1,2,3,4,5]) ** (MatchError) no match of right hand side
value: [1, 2, 3, 4, 5] 243
@bitcapulet def run(list) do [a,b,c,d] = list [d,c,b,a] end 244
object?
@bitcapulet {tuple} 245
@bitcapulet quartet = {1,2,3,4} trio = {"one", 2, %{}} 246
@bitcapulet def run(tuple) do {a,b,c,d} = tuple {d,c,b,a} end 247
@bitcapulet def run(tuple) do {a,b,c,d} = tuple {d,c,b,a} end 248
@bitcapulet def run({a,b,c,d}) do {d,c,b,a} end 249
@bitcapulet def run(tuple = {a,b,c,d}) do IO.inspect(tuple) {d,c,b,a} end 250
@bitcapulet def run(tuple = {a,b,c,d}) do IO.inspect(tuple) {d,c,b,a} end 251
Now reverse 5!
@bitcapulet def run(tuple = {a,b,c,d}) do IO.inspect(tuple) {d,c,b,a} end def
run(tuple = {a,b,c,d,e}) do IO.inspect(tuple) {e,d,c,b,a} end 252
@bitcapulet def run(tuple = {a,b,c,d}) do IO.inspect(tuple) {d,c,b,a} end def
run(tuple = {a,b,c,d,e}) do IO.inspect(tuple) {e,d,c,b,a} end 253
@bitcapulet def run(tuple = {a,b,c,d}) do IO.inspect(tuple) {d,c,b,a} end def
run(tuple = {a,b,c,d,e}) do IO.inspect(tuple) {e,d,c,b,a} end 254
@bitcapulet def run(tuple = {a,b,c,d}) do IO.inspect(tuple) {d,c,b,a} end def
run(tuple = {a,b,c,d,e}) do IO.inspect(tuple) {e,d,c,b,a} end 255
@bitcapulet def run(tuple = {a,b,c,d}) do IO.inspect(tuple) {d,c,b,a} end def
run(tuple = {a,b,c,d,e}) do IO.inspect(tuple) {e,d,c,b,a} end 256
@bitcapulet def run(tuple = {a,b,c,d}) do IO.inspect(tuple) {d,c,b,a} end def
run(tuple = {a,b,c,d,e}) do IO.inspect(tuple) {e,d,c,b,a} end 257
@bitcapulet def run(tuple = {a,b,c,d}) do IO.inspect(tuple) {d,c,b,a} end def
run(tuple = {a,b,c,d,e}) do IO.inspect(tuple) {e,d,c,b,a} end 258
@bitcapulet This is why Java has factories! 259
@bitcapulet GenServer Steal from telephony. 260
@bitcapulet A process is a recursive function that holds state
and lives at an address with a mailbox. <0.194.0> 261
@bitcapulet A GenServer is like a Starfleet officer 262
@bitcapulet defmodule Phil do IO.puts("Phil got: " <> value) end
263
@bitcapulet defmodule Phil do use GenServer def init(_args), do: 0
def handle_cast(value, from, state) do IO.puts("Phil got: " <> value) {:noreply, state + 1} end end 264
@bitcapulet defmodule Phil do use GenServer def init(_args), do: 0
def handle_cast(value, from, state) do IO.puts("Phil got: " <> value) {:noreply, state + 1} end end 265
@bitcapulet defmodule Phil do use GenServer def init(_args), do: 0
def handle_cast(value, from, state) do IO.puts("Phil got: " <> value) {:noreply, state + 1} end end 266
@bitcapulet defmodule Phil do use GenServer def init(_args), do: 0
def handle_cast(value, from, state) do IO.puts("Phil got: " <> value) {:noreply, state + 1} end end 267
@bitcapulet defmodule Phil do use GenServer def init(_args), do: 0
def handle_cast(value, from, state) do IO.puts("Phil got: " <> value) {:noreply, state + 1} end def handle_call(:say_something, from, state) do {:reply, "something", state} end end 268
@bitcapulet {:ok, pid} = GenServer.start_link(Phil, "arg") def init(_args), do: 0
Spawn a GenServer 269
@bitcapulet Asynchronous requests def handle_cast(value, from, state) do IO.puts("Phil got:
" <> value) {:noreply, state + 1} end GenServer.cast(pid, "a present") move_right_along() 270
@bitcapulet def handle_call(:say_something, from, state) do IO.puts("Phil got: " <>
value) {:reply, "Thanks", state} end Synchronous requests reply = GenServer.call(pid, :say_something) 271
@bitcapulet Synchronous requests reply = GenServer.call(pid, :say_something) 272 PID passing
gets old
@bitcapulet GenServer.start_link(Phil, "arg", name: :phil) Fee pid Registry 273
@bitcapulet GenServer.start_link(Phil, "arg", name: :phil) GenServer.cast(:phil, "a present with your
name on it") Fee pid Registry 274
@bitcapulet GenServer.start_link(Phil, "arg", name: :phil) GenServer.cast(:phil, "a present with your
name on it") pid = Process.whereis(:phil) Fee pid Registry 275
@bitcapulet Supervisors 276
@bitcapulet Supervisors 277
@bitcapulet defmodule CaptJoan do use Supervisor def init(_args) do children
= [ {Phil, []} ] Supervisor.init(children, strategy: :one_for_one) end end 278
@bitcapulet defmodule CaptJoan do use Supervisor def init(_args) do children
= [ {Phil, []} ] Supervisor.init(children, strategy: :one_for_one) end end 279
@bitcapulet defmodule CaptJoan do use Supervisor def init(_args) do children
= [ {Phil, []} ] Supervisor.init(children, strategy: :one_for_one) end end 280
@bitcapulet defmodule CaptJoan do use Supervisor def init(_args) do children
= [ {Phil, []}, {Phil, []}, {Phil, []} ] Supervisor.init(children, strategy: :one_for_one) end end 281
@bitcapulet defmodule CaptJoan do use Supervisor def init(_args) do children
= [ {Phil, []}, {Phil, []}, {Phil, []} ] Supervisor.init(children, strategy: :one_for_one) end end 282
@bitcapulet 283
@bitcapulet 284
@bitcapulet 285
@bitcapulet defmodule CaptJoan do use Supervisor def init(_args) do children
= [ {Phil, []}, {Phil, []}, {Phil, ["arg"]} ] Supervisor.init(children, strategy: :one_for_one) end end 286
@bitcapulet defmodule CaptJoan do use Supervisor def init(_args) do children
= [ {Phil, []}, {Phil, []}, {Phil, ["arg"]} ] Supervisor.init(children, strategy: :one_for_all) end end 287
@bitcapulet defmodule AdmiralRavi do use Supervisor def init(_args) do children
= [ {CaptJoan, []}, {CaptJoan, []}, {CaptJoan, []} ] Supervisor.init(children, strategy: :one_for_one) end end 288
@bitcapulet289
@bitcapulet290
@bitcapulet291
@bitcapulet292
@bitcapulet293
@bitcapulet294
@bitcapulet295
@bitcapulet296
@bitcapulet297
@bitcapulet298
@bitcapulet299
@bitcapulet300
@bitcapulet301
@bitcapulet302
@bitcapulet303
@bitcapulet #PID<0.96.0> <0.194.0> 304
@bitcapulet305 send(pid, "hello") GenServer.cast(:phil, "a present with your name on
it")
@bitcapulet ◍ timeouts ◍ linking processes ◌ monitoring ◌ trapping
exits ◍ error handling Other benefits 306
@bitcapulet defmodule AdmiralRavi do use Supervisor def init(_args) do children
= [ {CaptJoan, []}, {CaptJoan, []}, {CaptJoan, []} ] Supervisor.init(children, strategy: :one_for_one) end end 307
@bitcapulet %{} ME WANT MORE BREAK! 308
@bitcapulet
@bitcapulet
@bitcapulet
@bitcapulet
@bitcapulet
@bitcapulet Function Pipeline State complexity clearly 314
@bitcapulet def fav_capt(:kirk) do {:error, "Are you kidding me?"} end
def fav_capt(:picard) do {:ok, "You chose wisely."} end 315
@bitcapulet capt = :picard {:ok, message} = fav_capt(capt) IO.puts(message) 316
@bitcapulet capt = :kirk {:ok, message} = fav_capt(capt) IO.puts(message) **
(MatchError) no match of right hand side value: {:error, "Are you kidding me?"} 317
@bitcapulet capt = :kirk case fav_capt(capt) {:ok, msg} -> msg
{:error, msg} -> Log.error("oops") end 318
@bitcapulet capt = :kirk case fav_capt(capt) {:ok, msg} -> msg
{:error, _msg} -> Log.error("oops") end 319
@bitcapulet capt = :kirk case fav_capt(capt) {:ok, msg} -> msg
{:error, _msg} -> Log.error("oops") {_, _msg} -> Log.error("What?!") end 320
@bitcapulet capt = :kirk case fav_capt(capt) {:ok, msg} -> msg
{:error, _msg} -> Log.error("oops") {_, _msg} -> Log.error("What?!") _ -> Log.error("Oh dear.") end 321
@bitcapulet case fav_capt(capt) {:ok, msg} -> Log.info("That went well.") msg
{:error, _msg} -> Log.error("oops") {_, _msg} -> Log.error("What?!") _ -> Log.error("Oh dear.") end 322
@bitcapulet def respond({:ok, msg}) do Log.info("That went well.") msg end
def respond({:error, _msg}) do Log.error("oops") end 323
@bitcapulet respond(fav_capt(capt)) 324
@bitcapulet respond(fav_capt(capt)) capt |> fav_capt() |> respond() 325
@bitcapulet326
@bitcapulet capt |> fav_capt() |> respond() 327
@bitcapulet capt.fav_capt().respond() // This is constrained. 328
@bitcapulet capt |> fav_capt() |> respond() 329
@bitcapulet capt |> 330
@bitcapulet capt |> beam_to_planet() 331
@bitcapulet capt |> beam_to_planet() |> meet_aliens() 332
@bitcapulet capt |> beam_to_planet() |> meet_aliens() |> romance?() 333
@bitcapulet capt |> beam_to_planet() |> meet_aliens() |> romance?() |> case
do {:ok, details} -> log(details) :error -> kill_off_extra() end 334
@bitcapulet capt |> beam_to_planet() |> meet_aliens() |> romance?() |> case
do {:ok, details} -> log(details) :error -> kill_off_extra() end 335
@bitcapulet capt |> beam_to_planet() |> meet_aliens() |> romance?() |> case
do {:ok, details} -> log(details) :error -> kill_off_extra() end 336
@bitcapulet [1, 2, 3] 337
@bitcapulet [1, 2, 3] |> Enum.map(fn i -> i +
1 end) # [2, 3, 4] 338
@bitcapulet [1, 2, 3] |> Enum.map(fn i -> i +
1 end) |> Enum.sum() # 9 339
@bitcapulet %{} It late. Wrap it up. 340
@bitcapulet341 GenServer.start_link(CircleKeeper,[], name: :circle_keeper) GenServer.cast(:circle_keeper, {:add, %Circle{radius: 3}) total_area =
GenServer.call(:circle_keeper, :total_area)
@bitcapulet defmodule CircleKeeper do use GenServer def init(starting_circles), do: starting_circles
def handle_cast({:add, circle}, _, circles), do: {:noreply, circles ++ circle} def handle_call(:total_area, circles), do: {:reply, sum_radii(circles), circles} defp sum_radii(circles) do circles |> Enum.map(fn c -> Circle.area(c.radius) end) |> Enum.sum() end end 342
@bitcapulet {} 343
@bitcapulet %{} 344
@bitcapulet %{} 345
@bitcapulet %{} 346
@bitcapulet %{} Me here to say something inspiring to end
talk. 347
@bitcapulet %{} Language not really most important thing. 348
@bitcapulet %{} It matter you do job. 349
@bitcapulet %{} It matter you do job. And you happy
with job you do. 350
@bitcapulet %{} It also matter you make lots of money.
351
@bitcapulet %{} This language not make more money. 352
@bitcapulet %{} This language not make more money. But maybe
make more happy. 353
@bitcapulet %{} Adrian happy. 354
@bitcapulet %{} Adrian happy. He crazy. 355
@bitcapulet %{} Adrian happy. He crazy. But he happy. 356
@bitcapulet %{} He right about Elixir. It great. 357
@bitcapulet %{} Me hope you friends try it out. 358
@bitcapulet %{} 359
@bitcapulet %{} You know how you thank me. 360
@bitcapulet %{ } 361
@bitcapulet %{0} 362
@bitcapulet %{} 363
@bitcapulet %{*} 364
@bitcapulet %{} 365
@bitcapulet %{.} 366
@bitcapulet %{} 367
@bitcapulet %{} Bye! 368
@bitcapulet %{} 369
@bitcapulet %{} 370
@bitcapulet %{} 371
@bitcapulet %{} 372
@bitcapulet %{} 373
@bitcapulet %{} 374
@bitcapulet375
@bitcapulet Pinball Elixir Presentation template by SlidesCarnival 376 Adrian P.
Dunston @bitcapulet
[email protected]
joinpapa.com