2014.12.04 - Elixir @ Erlang Factory Berlin · Title: 2014.12.04 - Elixir @ Erlang Factory Berlin...
Transcript of 2014.12.04 - Elixir @ Erlang Factory Berlin · Title: 2014.12.04 - Elixir @ Erlang Factory Berlin...
![Page 1: 2014.12.04 - Elixir @ Erlang Factory Berlin · Title: 2014.12.04 - Elixir @ Erlang Factory Berlin Created Date: 6/12/2015 10:40:42 AM](https://reader034.fdocuments.us/reader034/viewer/2022052101/603b307c91122b04d07bd27c/html5/thumbnails/1.jpg)
@elixirlang / elixir-lang.org
![Page 2: 2014.12.04 - Elixir @ Erlang Factory Berlin · Title: 2014.12.04 - Elixir @ Erlang Factory Berlin Created Date: 6/12/2015 10:40:42 AM](https://reader034.fdocuments.us/reader034/viewer/2022052101/603b307c91122b04d07bd27c/html5/thumbnails/2.jpg)
It is not about the syntax!
![Page 3: 2014.12.04 - Elixir @ Erlang Factory Berlin · Title: 2014.12.04 - Elixir @ Erlang Factory Berlin Created Date: 6/12/2015 10:40:42 AM](https://reader034.fdocuments.us/reader034/viewer/2022052101/603b307c91122b04d07bd27c/html5/thumbnails/3.jpg)
Data (types) Modules
Processes
Tooling
![Page 4: 2014.12.04 - Elixir @ Erlang Factory Berlin · Title: 2014.12.04 - Elixir @ Erlang Factory Berlin Created Date: 6/12/2015 10:40:42 AM](https://reader034.fdocuments.us/reader034/viewer/2022052101/603b307c91122b04d07bd27c/html5/thumbnails/4.jpg)
No custom data types
• Records aimed to add tagged tuplesbut the implementation backfired
• Maps are an improvement (imo)but do not officialise "tagging"
![Page 5: 2014.12.04 - Elixir @ Erlang Factory Berlin · Title: 2014.12.04 - Elixir @ Erlang Factory Berlin Created Date: 6/12/2015 10:40:42 AM](https://reader034.fdocuments.us/reader034/viewer/2022052101/603b307c91122b04d07bd27c/html5/thumbnails/5.jpg)
![Page 6: 2014.12.04 - Elixir @ Erlang Factory Berlin · Title: 2014.12.04 - Elixir @ Erlang Factory Berlin Created Date: 6/12/2015 10:40:42 AM](https://reader034.fdocuments.us/reader034/viewer/2022052101/603b307c91122b04d07bd27c/html5/thumbnails/6.jpg)
Collections
widgets.filter(b -> b.getColor() == RED) .mapToInt(b -> b.getWeight()) .sum()
![Page 7: 2014.12.04 - Elixir @ Erlang Factory Berlin · Title: 2014.12.04 - Elixir @ Erlang Factory Berlin Created Date: 6/12/2015 10:40:42 AM](https://reader034.fdocuments.us/reader034/viewer/2022052101/603b307c91122b04d07bd27c/html5/thumbnails/7.jpg)
Laziness in collections
widgets.stream() .filter(b -> b.getColor() == RED) .mapToInt(b -> b.getWeight()) .sum()
![Page 8: 2014.12.04 - Elixir @ Erlang Factory Berlin · Title: 2014.12.04 - Elixir @ Erlang Factory Berlin Created Date: 6/12/2015 10:40:42 AM](https://reader034.fdocuments.us/reader034/viewer/2022052101/603b307c91122b04d07bd27c/html5/thumbnails/8.jpg)
Elixir
![Page 9: 2014.12.04 - Elixir @ Erlang Factory Berlin · Title: 2014.12.04 - Elixir @ Erlang Factory Berlin Created Date: 6/12/2015 10:40:42 AM](https://reader034.fdocuments.us/reader034/viewer/2022052101/603b307c91122b04d07bd27c/html5/thumbnails/9.jpg)
• Extensibility • Productivity • Compatibility
Goals
![Page 10: 2014.12.04 - Elixir @ Erlang Factory Berlin · Title: 2014.12.04 - Elixir @ Erlang Factory Berlin Created Date: 6/12/2015 10:40:42 AM](https://reader034.fdocuments.us/reader034/viewer/2022052101/603b307c91122b04d07bd27c/html5/thumbnails/10.jpg)
Extensibility
![Page 11: 2014.12.04 - Elixir @ Erlang Factory Berlin · Title: 2014.12.04 - Elixir @ Erlang Factory Berlin Created Date: 6/12/2015 10:40:42 AM](https://reader034.fdocuments.us/reader034/viewer/2022052101/603b307c91122b04d07bd27c/html5/thumbnails/11.jpg)
Data type polymorphism
![Page 12: 2014.12.04 - Elixir @ Erlang Factory Berlin · Title: 2014.12.04 - Elixir @ Erlang Factory Berlin Created Date: 6/12/2015 10:40:42 AM](https://reader034.fdocuments.us/reader034/viewer/2022052101/603b307c91122b04d07bd27c/html5/thumbnails/12.jpg)
Data (types) Modules
Processes
![Page 13: 2014.12.04 - Elixir @ Erlang Factory Berlin · Title: 2014.12.04 - Elixir @ Erlang Factory Berlin Created Date: 6/12/2015 10:40:42 AM](https://reader034.fdocuments.us/reader034/viewer/2022052101/603b307c91122b04d07bd27c/html5/thumbnails/13.jpg)
Processes Pid ! Message
“Any process that handles this message”
![Page 14: 2014.12.04 - Elixir @ Erlang Factory Berlin · Title: 2014.12.04 - Elixir @ Erlang Factory Berlin Created Date: 6/12/2015 10:40:42 AM](https://reader034.fdocuments.us/reader034/viewer/2022052101/603b307c91122b04d07bd27c/html5/thumbnails/14.jpg)
Modules Module:function()
“Any module that exports this function”
![Page 15: 2014.12.04 - Elixir @ Erlang Factory Berlin · Title: 2014.12.04 - Elixir @ Erlang Factory Berlin Created Date: 6/12/2015 10:40:42 AM](https://reader034.fdocuments.us/reader034/viewer/2022052101/603b307c91122b04d07bd27c/html5/thumbnails/15.jpg)
Data (types)
?????
“Any data type that does ????”
![Page 16: 2014.12.04 - Elixir @ Erlang Factory Berlin · Title: 2014.12.04 - Elixir @ Erlang Factory Berlin Created Date: 6/12/2015 10:40:42 AM](https://reader034.fdocuments.us/reader034/viewer/2022052101/603b307c91122b04d07bd27c/html5/thumbnails/16.jpg)
-module(json).
encode(Item) when is_list(Item) -> % ... encode(Item) when is_binary(Item) -> % ... encode(Item) when is_number(Item) -> % ...
erlang
![Page 17: 2014.12.04 - Elixir @ Erlang Factory Berlin · Title: 2014.12.04 - Elixir @ Erlang Factory Berlin Created Date: 6/12/2015 10:40:42 AM](https://reader034.fdocuments.us/reader034/viewer/2022052101/603b307c91122b04d07bd27c/html5/thumbnails/17.jpg)
Luaerl (Robert)
erl2 (Joe)
JSON
fork fork
![Page 18: 2014.12.04 - Elixir @ Erlang Factory Berlin · Title: 2014.12.04 - Elixir @ Erlang Factory Berlin Created Date: 6/12/2015 10:40:42 AM](https://reader034.fdocuments.us/reader034/viewer/2022052101/603b307c91122b04d07bd27c/html5/thumbnails/18.jpg)
-module(json).
encode(Item) when is_list(Item) -> % ... encode(Item) when is_binary(Item) -> % ... encode(Item) when is_number(Item) -> % ...
erlang
![Page 19: 2014.12.04 - Elixir @ Erlang Factory Berlin · Title: 2014.12.04 - Elixir @ Erlang Factory Berlin Created Date: 6/12/2015 10:40:42 AM](https://reader034.fdocuments.us/reader034/viewer/2022052101/603b307c91122b04d07bd27c/html5/thumbnails/19.jpg)
The data type is the one that knows how to
convert itself to JSON
![Page 20: 2014.12.04 - Elixir @ Erlang Factory Berlin · Title: 2014.12.04 - Elixir @ Erlang Factory Berlin Created Date: 6/12/2015 10:40:42 AM](https://reader034.fdocuments.us/reader034/viewer/2022052101/603b307c91122b04d07bd27c/html5/thumbnails/20.jpg)
defprotocol JSON do def encode(item) end
JSON.encode(item)
elixir
![Page 21: 2014.12.04 - Elixir @ Erlang Factory Berlin · Title: 2014.12.04 - Elixir @ Erlang Factory Berlin Created Date: 6/12/2015 10:40:42 AM](https://reader034.fdocuments.us/reader034/viewer/2022052101/603b307c91122b04d07bd27c/html5/thumbnails/21.jpg)
defimpl JSON, for: List do def encode(item) # ... end
elixir
defimpl JSON, for: BitString do def encode(item) # ... end
defimpl JSON, for: Number do def encode(item) # ... end
![Page 22: 2014.12.04 - Elixir @ Erlang Factory Berlin · Title: 2014.12.04 - Elixir @ Erlang Factory Berlin Created Date: 6/12/2015 10:40:42 AM](https://reader034.fdocuments.us/reader034/viewer/2022052101/603b307c91122b04d07bd27c/html5/thumbnails/22.jpg)
I can write a JSON library that is extensible to any data type
![Page 23: 2014.12.04 - Elixir @ Erlang Factory Berlin · Title: 2014.12.04 - Elixir @ Erlang Factory Berlin Created Date: 6/12/2015 10:40:42 AM](https://reader034.fdocuments.us/reader034/viewer/2022052101/603b307c91122b04d07bd27c/html5/thumbnails/23.jpg)
Data (types)
JSON.encode(data)
“Any data type that implements a protocol”
![Page 24: 2014.12.04 - Elixir @ Erlang Factory Berlin · Title: 2014.12.04 - Elixir @ Erlang Factory Berlin Created Date: 6/12/2015 10:40:42 AM](https://reader034.fdocuments.us/reader034/viewer/2022052101/603b307c91122b04d07bd27c/html5/thumbnails/24.jpg)
Enum.map [1,2,3], fn(x) -> x * 2end#=> [2,4,6]
elixirEnumerable Protocol
![Page 25: 2014.12.04 - Elixir @ Erlang Factory Berlin · Title: 2014.12.04 - Elixir @ Erlang Factory Berlin Created Date: 6/12/2015 10:40:42 AM](https://reader034.fdocuments.us/reader034/viewer/2022052101/603b307c91122b04d07bd27c/html5/thumbnails/25.jpg)
Enum.map 1..5, fn(x) -> x * 2end#=> [2,4,6,8,10]
elixirEnumerable Protocol
![Page 26: 2014.12.04 - Elixir @ Erlang Factory Berlin · Title: 2014.12.04 - Elixir @ Erlang Factory Berlin Created Date: 6/12/2015 10:40:42 AM](https://reader034.fdocuments.us/reader034/viewer/2022052101/603b307c91122b04d07bd27c/html5/thumbnails/26.jpg)
Enumerable Protocol
• Based on Haskell Iteratees • Works with in-memory collections
and resources (like I/O, File, etc)
![Page 27: 2014.12.04 - Elixir @ Erlang Factory Berlin · Title: 2014.12.04 - Elixir @ Erlang Factory Berlin Created Date: 6/12/2015 10:40:42 AM](https://reader034.fdocuments.us/reader034/viewer/2022052101/603b307c91122b04d07bd27c/html5/thumbnails/27.jpg)
Enumerable Protocol
# Uses raw & read_aheadfile = File.stream(path)Enum.take(file, 5)
![Page 28: 2014.12.04 - Elixir @ Erlang Factory Berlin · Title: 2014.12.04 - Elixir @ Erlang Factory Berlin Created Date: 6/12/2015 10:40:42 AM](https://reader034.fdocuments.us/reader034/viewer/2022052101/603b307c91122b04d07bd27c/html5/thumbnails/28.jpg)
erlang
1> dict:from_list([{a,1}]).{dict,1,16,16,8,80,48, {[],[],[],[],[],[],[],[],[],[], [],[],[],[],[],[]}, {{[], [[a|1]], [],[],[],[],[],[],[],[],[],[], [],[],[],[]}}}
Inspect Protocol
![Page 29: 2014.12.04 - Elixir @ Erlang Factory Berlin · Title: 2014.12.04 - Elixir @ Erlang Factory Berlin Created Date: 6/12/2015 10:40:42 AM](https://reader034.fdocuments.us/reader034/viewer/2022052101/603b307c91122b04d07bd27c/html5/thumbnails/29.jpg)
iex> HashDict.new(a: 1)#HashDict<[a: 1]>
elixirInspect Protocol
![Page 30: 2014.12.04 - Elixir @ Erlang Factory Berlin · Title: 2014.12.04 - Elixir @ Erlang Factory Berlin Created Date: 6/12/2015 10:40:42 AM](https://reader034.fdocuments.us/reader034/viewer/2022052101/603b307c91122b04d07bd27c/html5/thumbnails/30.jpg)
Productivity
![Page 31: 2014.12.04 - Elixir @ Erlang Factory Berlin · Title: 2014.12.04 - Elixir @ Erlang Factory Berlin Created Date: 6/12/2015 10:40:42 AM](https://reader034.fdocuments.us/reader034/viewer/2022052101/603b307c91122b04d07bd27c/html5/thumbnails/31.jpg)
Mix + Hex + Docs
![Page 32: 2014.12.04 - Elixir @ Erlang Factory Berlin · Title: 2014.12.04 - Elixir @ Erlang Factory Berlin Created Date: 6/12/2015 10:40:42 AM](https://reader034.fdocuments.us/reader034/viewer/2022052101/603b307c91122b04d07bd27c/html5/thumbnails/32.jpg)
$ mix new foo$ cd foo$ mix test$ mix hex.publish$ mix hex.docs
![Page 33: 2014.12.04 - Elixir @ Erlang Factory Berlin · Title: 2014.12.04 - Elixir @ Erlang Factory Berlin Created Date: 6/12/2015 10:40:42 AM](https://reader034.fdocuments.us/reader034/viewer/2022052101/603b307c91122b04d07bd27c/html5/thumbnails/33.jpg)
Compatibility
![Page 34: 2014.12.04 - Elixir @ Erlang Factory Berlin · Title: 2014.12.04 - Elixir @ Erlang Factory Berlin Created Date: 6/12/2015 10:40:42 AM](https://reader034.fdocuments.us/reader034/viewer/2022052101/603b307c91122b04d07bd27c/html5/thumbnails/34.jpg)
OTP & Elixir
• GenServer (plus Task and Agents) • GenRouter
![Page 35: 2014.12.04 - Elixir @ Erlang Factory Berlin · Title: 2014.12.04 - Elixir @ Erlang Factory Berlin Created Date: 6/12/2015 10:40:42 AM](https://reader034.fdocuments.us/reader034/viewer/2022052101/603b307c91122b04d07bd27c/html5/thumbnails/35.jpg)
GenServer
Only Computation
Only State
GenServerTask Agent
![Page 36: 2014.12.04 - Elixir @ Erlang Factory Berlin · Title: 2014.12.04 - Elixir @ Erlang Factory Berlin Created Date: 6/12/2015 10:40:42 AM](https://reader034.fdocuments.us/reader034/viewer/2022052101/603b307c91122b04d07bd27c/html5/thumbnails/36.jpg)
Task
• Task.start_link/3 is similar to proc_lib:spawn_link/3
![Page 37: 2014.12.04 - Elixir @ Erlang Factory Berlin · Title: 2014.12.04 - Elixir @ Erlang Factory Berlin Created Date: 6/12/2015 10:40:42 AM](https://reader034.fdocuments.us/reader034/viewer/2022052101/603b307c91122b04d07bd27c/html5/thumbnails/37.jpg)
async / awaitTop = self(),Ref = make_ref(),
Pid = spawn_link(fun -> Top ! {Ref, …}end),
receive {Ref, Value} -> Valueend
![Page 38: 2014.12.04 - Elixir @ Erlang Factory Berlin · Title: 2014.12.04 - Elixir @ Erlang Factory Berlin Created Date: 6/12/2015 10:40:42 AM](https://reader034.fdocuments.us/reader034/viewer/2022052101/603b307c91122b04d07bd27c/html5/thumbnails/38.jpg)
async / await
task = Task.async(&calculate_x/0)# Do something elseTask.await(task)
![Page 39: 2014.12.04 - Elixir @ Erlang Factory Berlin · Title: 2014.12.04 - Elixir @ Erlang Factory Berlin Created Date: 6/12/2015 10:40:42 AM](https://reader034.fdocuments.us/reader034/viewer/2022052101/603b307c91122b04d07bd27c/html5/thumbnails/39.jpg)
Distributed Tasks
# In the remote nodeTask.Supervisor.start_link(name: :tasks_sup)
# In the clientTask.Supervisor.async( {:tasks_sup, :remote@local}, &calculate_x/0)
![Page 40: 2014.12.04 - Elixir @ Erlang Factory Berlin · Title: 2014.12.04 - Elixir @ Erlang Factory Berlin Created Date: 6/12/2015 10:40:42 AM](https://reader034.fdocuments.us/reader034/viewer/2022052101/603b307c91122b04d07bd27c/html5/thumbnails/40.jpg)
Agent
agent = Agent.start_link(&initial_state/0)Agent.update(agent, &increment/1)Agent.get(agent, &identity/1)
![Page 41: 2014.12.04 - Elixir @ Erlang Factory Berlin · Title: 2014.12.04 - Elixir @ Erlang Factory Berlin Created Date: 6/12/2015 10:40:42 AM](https://reader034.fdocuments.us/reader034/viewer/2022052101/603b307c91122b04d07bd27c/html5/thumbnails/41.jpg)
![Page 42: 2014.12.04 - Elixir @ Erlang Factory Berlin · Title: 2014.12.04 - Elixir @ Erlang Factory Berlin Created Date: 6/12/2015 10:40:42 AM](https://reader034.fdocuments.us/reader034/viewer/2022052101/603b307c91122b04d07bd27c/html5/thumbnails/42.jpg)
Agent.Lattices
• A set of agents/operations guaranteed to deterministic for parallelism?
![Page 43: 2014.12.04 - Elixir @ Erlang Factory Berlin · Title: 2014.12.04 - Elixir @ Erlang Factory Berlin Created Date: 6/12/2015 10:40:42 AM](https://reader034.fdocuments.us/reader034/viewer/2022052101/603b307c91122b04d07bd27c/html5/thumbnails/43.jpg)
![Page 44: 2014.12.04 - Elixir @ Erlang Factory Berlin · Title: 2014.12.04 - Elixir @ Erlang Factory Berlin Created Date: 6/12/2015 10:40:42 AM](https://reader034.fdocuments.us/reader034/viewer/2022052101/603b307c91122b04d07bd27c/html5/thumbnails/44.jpg)
Agent.CRDT
• A set of agents/operations guaranteed to replicatable across nodes?
![Page 45: 2014.12.04 - Elixir @ Erlang Factory Berlin · Title: 2014.12.04 - Elixir @ Erlang Factory Berlin Created Date: 6/12/2015 10:40:42 AM](https://reader034.fdocuments.us/reader034/viewer/2022052101/603b307c91122b04d07bd27c/html5/thumbnails/45.jpg)
Parallelism
![Page 46: 2014.12.04 - Elixir @ Erlang Factory Berlin · Title: 2014.12.04 - Elixir @ Erlang Factory Berlin Created Date: 6/12/2015 10:40:42 AM](https://reader034.fdocuments.us/reader034/viewer/2022052101/603b307c91122b04d07bd27c/html5/thumbnails/46.jpg)
Parallelism
• Laziness • Pipeline parallelism • Data parallelism
![Page 47: 2014.12.04 - Elixir @ Erlang Factory Berlin · Title: 2014.12.04 - Elixir @ Erlang Factory Berlin Created Date: 6/12/2015 10:40:42 AM](https://reader034.fdocuments.us/reader034/viewer/2022052101/603b307c91122b04d07bd27c/html5/thumbnails/47.jpg)
Collections
widgets|> Enum.filter(fn b -> b[:color] == RED end)|> Enum.map(fn b -> b[:weight] end)|> Enum.take(5)
![Page 48: 2014.12.04 - Elixir @ Erlang Factory Berlin · Title: 2014.12.04 - Elixir @ Erlang Factory Berlin Created Date: 6/12/2015 10:40:42 AM](https://reader034.fdocuments.us/reader034/viewer/2022052101/603b307c91122b04d07bd27c/html5/thumbnails/48.jpg)
Streams / Laziness
widgets|> Stream.filter(fn b -> b[:color] == RED end)|> Stream.map(fn b -> b[:weight] end)|> Stream.take(5)|> Enum.to_list()
![Page 49: 2014.12.04 - Elixir @ Erlang Factory Berlin · Title: 2014.12.04 - Elixir @ Erlang Factory Berlin Created Date: 6/12/2015 10:40:42 AM](https://reader034.fdocuments.us/reader034/viewer/2022052101/603b307c91122b04d07bd27c/html5/thumbnails/49.jpg)
Pipeline Parallelism
widgets|> Stream.filter(fn b -> b[:color] == RED end)|> Stream.map(fn b -> b[:weight] end)|> Stream.take(5)|> Stream.async()|> Enum.to_list()
![Page 50: 2014.12.04 - Elixir @ Erlang Factory Berlin · Title: 2014.12.04 - Elixir @ Erlang Factory Berlin Created Date: 6/12/2015 10:40:42 AM](https://reader034.fdocuments.us/reader034/viewer/2022052101/603b307c91122b04d07bd27c/html5/thumbnails/50.jpg)
Pipeline Parallelismdata|> …|> Stream.async()|> …|> Stream.async()|> …|> Stream.async()|> …|> Enum.to_list()
![Page 51: 2014.12.04 - Elixir @ Erlang Factory Berlin · Title: 2014.12.04 - Elixir @ Erlang Factory Berlin Created Date: 6/12/2015 10:40:42 AM](https://reader034.fdocuments.us/reader034/viewer/2022052101/603b307c91122b04d07bd27c/html5/thumbnails/51.jpg)
Pipeline Parallelism
? ? ?input output
![Page 52: 2014.12.04 - Elixir @ Erlang Factory Berlin · Title: 2014.12.04 - Elixir @ Erlang Factory Berlin Created Date: 6/12/2015 10:40:42 AM](https://reader034.fdocuments.us/reader034/viewer/2022052101/603b307c91122b04d07bd27c/html5/thumbnails/52.jpg)
Pipeline Parallelism
GenRouter GenRouter GenRouterinput output
![Page 53: 2014.12.04 - Elixir @ Erlang Factory Berlin · Title: 2014.12.04 - Elixir @ Erlang Factory Berlin Created Date: 6/12/2015 10:40:42 AM](https://reader034.fdocuments.us/reader034/viewer/2022052101/603b307c91122b04d07bd27c/html5/thumbnails/53.jpg)
GenRouter• Specifies the message format for
connecting different processes • GenEvent replacement where we have
one process per handler • While allowing custom dispatch rules
![Page 54: 2014.12.04 - Elixir @ Erlang Factory Berlin · Title: 2014.12.04 - Elixir @ Erlang Factory Berlin Created Date: 6/12/2015 10:40:42 AM](https://reader034.fdocuments.us/reader034/viewer/2022052101/603b307c91122b04d07bd27c/html5/thumbnails/54.jpg)
GenRouter
@spec init(args) @spec handle_up(pid, ref, state) @spec handle_down(reason, pid, ref, state) @spec handle_dispatch(event, state) @spec handle_info(message, state) @spec code_change(old_vsn, state, extra) @spec terminate(reason, state)
![Page 55: 2014.12.04 - Elixir @ Erlang Factory Berlin · Title: 2014.12.04 - Elixir @ Erlang Factory Berlin Created Date: 6/12/2015 10:40:42 AM](https://reader034.fdocuments.us/reader034/viewer/2022052101/603b307c91122b04d07bd27c/html5/thumbnails/55.jpg)
GenRouter
@spec init(args) @spec handle_up(pid, ref, state) @spec handle_down(reason, pid, ref, state) @spec handle_dispatch(event, state) @spec handle_info(message, state) @spec code_change(old_vsn, state, extra) @spec terminate(reason, state)
![Page 56: 2014.12.04 - Elixir @ Erlang Factory Berlin · Title: 2014.12.04 - Elixir @ Erlang Factory Berlin Created Date: 6/12/2015 10:40:42 AM](https://reader034.fdocuments.us/reader034/viewer/2022052101/603b307c91122b04d07bd27c/html5/thumbnails/56.jpg)
@spec handle_dispatch(event, state) :: {:ok, [pid], state} | {:error, reason, state} | {:stop, reason, state}
GenRouter
![Page 57: 2014.12.04 - Elixir @ Erlang Factory Berlin · Title: 2014.12.04 - Elixir @ Erlang Factory Berlin Created Date: 6/12/2015 10:40:42 AM](https://reader034.fdocuments.us/reader034/viewer/2022052101/603b307c91122b04d07bd27c/html5/thumbnails/57.jpg)
GenRouter
router
![Page 58: 2014.12.04 - Elixir @ Erlang Factory Berlin · Title: 2014.12.04 - Elixir @ Erlang Factory Berlin Created Date: 6/12/2015 10:40:42 AM](https://reader034.fdocuments.us/reader034/viewer/2022052101/603b307c91122b04d07bd27c/html5/thumbnails/58.jpg)
GenRouter (broadcast)
router
1,2,3
1,2,3
1,2,3
1,2,3
![Page 59: 2014.12.04 - Elixir @ Erlang Factory Berlin · Title: 2014.12.04 - Elixir @ Erlang Factory Berlin Created Date: 6/12/2015 10:40:42 AM](https://reader034.fdocuments.us/reader034/viewer/2022052101/603b307c91122b04d07bd27c/html5/thumbnails/59.jpg)
GenRouter (round-robin)
router
1
2
3
4
![Page 60: 2014.12.04 - Elixir @ Erlang Factory Berlin · Title: 2014.12.04 - Elixir @ Erlang Factory Berlin Created Date: 6/12/2015 10:40:42 AM](https://reader034.fdocuments.us/reader034/viewer/2022052101/603b307c91122b04d07bd27c/html5/thumbnails/60.jpg)
GenRouter (sharding)
router
1,3
2
4
![Page 61: 2014.12.04 - Elixir @ Erlang Factory Berlin · Title: 2014.12.04 - Elixir @ Erlang Factory Berlin Created Date: 6/12/2015 10:40:42 AM](https://reader034.fdocuments.us/reader034/viewer/2022052101/603b307c91122b04d07bd27c/html5/thumbnails/61.jpg)
GenRouter (random)
router
2
1,3
4
![Page 62: 2014.12.04 - Elixir @ Erlang Factory Berlin · Title: 2014.12.04 - Elixir @ Erlang Factory Berlin Created Date: 6/12/2015 10:40:42 AM](https://reader034.fdocuments.us/reader034/viewer/2022052101/603b307c91122b04d07bd27c/html5/thumbnails/62.jpg)
Data Parallelism
• Stream.farm(data, …) • Stream.pmap(data, …) • Stream.chunked_pmap(data, …)
![Page 63: 2014.12.04 - Elixir @ Erlang Factory Berlin · Title: 2014.12.04 - Elixir @ Erlang Factory Berlin Created Date: 6/12/2015 10:40:42 AM](https://reader034.fdocuments.us/reader034/viewer/2022052101/603b307c91122b04d07bd27c/html5/thumbnails/63.jpg)
VM + OTP
![Page 64: 2014.12.04 - Elixir @ Erlang Factory Berlin · Title: 2014.12.04 - Elixir @ Erlang Factory Berlin Created Date: 6/12/2015 10:40:42 AM](https://reader034.fdocuments.us/reader034/viewer/2022052101/603b307c91122b04d07bd27c/html5/thumbnails/64.jpg)
Many interesting challenges
• What is the most efficient way of doing polymorphic dispatch?
• The most effective technique for implementing inline caches?
![Page 65: 2014.12.04 - Elixir @ Erlang Factory Berlin · Title: 2014.12.04 - Elixir @ Erlang Factory Berlin Created Date: 6/12/2015 10:40:42 AM](https://reader034.fdocuments.us/reader034/viewer/2022052101/603b307c91122b04d07bd27c/html5/thumbnails/65.jpg)
Many interesting challenges
• How to provide pipeline parallelism with back pressure efficiently?
• Which strategies are relevant for data parallelism?
![Page 66: 2014.12.04 - Elixir @ Erlang Factory Berlin · Title: 2014.12.04 - Elixir @ Erlang Factory Berlin Created Date: 6/12/2015 10:40:42 AM](https://reader034.fdocuments.us/reader034/viewer/2022052101/603b307c91122b04d07bd27c/html5/thumbnails/66.jpg)
elixir-lang.org
![Page 67: 2014.12.04 - Elixir @ Erlang Factory Berlin · Title: 2014.12.04 - Elixir @ Erlang Factory Berlin Created Date: 6/12/2015 10:40:42 AM](https://reader034.fdocuments.us/reader034/viewer/2022052101/603b307c91122b04d07bd27c/html5/thumbnails/67.jpg)
![Page 68: 2014.12.04 - Elixir @ Erlang Factory Berlin · Title: 2014.12.04 - Elixir @ Erlang Factory Berlin Created Date: 6/12/2015 10:40:42 AM](https://reader034.fdocuments.us/reader034/viewer/2022052101/603b307c91122b04d07bd27c/html5/thumbnails/68.jpg)
consulting and software engineering
![Page 69: 2014.12.04 - Elixir @ Erlang Factory Berlin · Title: 2014.12.04 - Elixir @ Erlang Factory Berlin Created Date: 6/12/2015 10:40:42 AM](https://reader034.fdocuments.us/reader034/viewer/2022052101/603b307c91122b04d07bd27c/html5/thumbnails/69.jpg)
plataformatec.com.br/elixir-radar
![Page 70: 2014.12.04 - Elixir @ Erlang Factory Berlin · Title: 2014.12.04 - Elixir @ Erlang Factory Berlin Created Date: 6/12/2015 10:40:42 AM](https://reader034.fdocuments.us/reader034/viewer/2022052101/603b307c91122b04d07bd27c/html5/thumbnails/70.jpg)
@elixirlang / elixir-lang.org