Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Про Elixir. Станислав Мехоношин

Про Elixir. Станислав Мехоношин

Deep Refactoring

May 02, 2017
Tweet

More Decks by Deep Refactoring

Other Decks in Programming

Transcript

  1. Про.Elixir
    Серия докладов: “Чем заняться вместо работы?”

    View Slide

  2. Stas Mekhonoshin
    Toptal.com
    github.com/Mehonoshin
    blog.cspub.net

    View Slide

  3. Откуда хайп?

    View Slide

  4. Jose Valim

    View Slide

  5. View Slide

  6. Руби-программисты

    View Slide

  7. Что это такое?

    View Slide

  8. First class functions
    Modules
    BEAM
    Pattern Matching
    Actors
    OTP
    Erlang && Elixir

    View Slide

  9. Functions && Modules
    defmodule ExBees.Map.SegmentsSupervisor do
    use Supervisor
    def start_link(name) do
    Supervisor.start_link(__MODULE__, :ok, name: name)
    End
    def init(:ok) do
    children = [
    supervisor(ExBees.Map.Segment, [ExBees.Map.Segment])
    ]
    supervise(children, strategy: :one_for_one)
    end
    end

    View Slide

  10. BEAM
    Lightweight processes
    Soft-realtime
    Full CPU utilization

    View Slide

  11. Pattern Matching
    iex> {a, b, c} = {:hello, "world", 42}
    {:hello, "world", 42}
    iex> a
    :hello
    iex> b
    "world"

    View Slide

  12. Pattern Matching 2
    iex> case {1, 2, 3} do
    ...> {4, 5, 6} ->
    ...> "This clause won't match"
    ...> {1, x, 3} ->
    ...> "This clause will match and bind x to 2 in this clause"
    ...> _ ->
    ...> "This clause would match any value"
    ...> end
    "This clause will match and bind x to 2 in this clause"

    View Slide

  13. Actors
    current_process = self()
    # Spawn an Elixir process (not an operating system one!)
    spawn_link(fn ->
    send current_process, {:msg, "hello world"}
    end)
    # Block until the message is received
    receive do
    {:msg, contents} -> IO.puts contents
    end

    View Slide

  14. Actors 2
    No shared memory
    GC per process

    View Slide

  15. OTP

    View Slide

  16. Блог на OTP

    View Slide

  17. Distributed
    Multi-Core
    Connections
    Fault-tolerant
    ДЛЯ ВАШЕГО БЛОГА
    Usecases

    View Slide

  18. VS

    View Slide

  19. Синтаксис
    -module(hello_module).
    -export([some_fun/0, some_fun/1]).
    % A "Hello world" function
    some_fun() ->
    io:format('~s~n', ['Hello world!']).
    % This one works only with lists
    some_fun(List) when is_list(List) ->
    io:format('~s~n', List).
    % Non-exported functions are private
    priv() ->
    secret_info.
    defmodule HelloModule do
    # A "Hello world" function
    def some_fun do
    IO.puts "Hello world!"
    end
    # This one works only with lists
    def some_fun(list) when is_list(list) do
    IO.inspect list
    end
    # A private function
    defp priv do
    :secret_info
    end
    end

    View Slide

  20. 0 : 1

    View Slide

  21. Экосистема
    Rebar Mix tool
    Hex.pm
    GenStage
    Phoenix Framework
    Plug

    View Slide

  22. 0 : 2

    View Slide

  23. Метапрограммирование
    defmodule MyValidator do
    use Validator
    validate_length :name, 1..100
    validate_matches :email, ~r/@/
    end
    MyValidator.validate(user)

    View Slide

  24. 0 : 3

    View Slide

  25. Мутабельность переменных
    ~ erl
    Eshell V8.2 (abort with ^G)
    1> A = 1.
    1
    2> A = 2.
    ** exception error: no match of
    right hand side value 2
    3> io:format("~p", [A]).
    1ok
    ~ iex
    Interactive Elixir (1.4.1) - press
    Ctrl+C to exit (type h() ENTER for
    help)
    iex(1)> a = 1
    1
    iex(2)> a = 2
    2
    iex(3)> IO.puts a
    2
    :ok

    View Slide

  26. 1 : 3

    View Slide

  27. Признание геями хипстерами
    НЕТ ДА

    View Slide

  28. ELIXIR WINS

    View Slide

  29. Коммьюнити
    Модное
    Стильное
    Очень активное
    Новые инструменты
    Простор для opensource

    View Slide

  30. "Разбудите меня лет через
    сто, и спросите, что
    сейчас делается на
    Гитхабе. И я отвечу —
    переписывают блоги с Ruby
    на Elixir."
    Михаил Салтыков-
    Щедрин 1826-1889

    View Slide

  31. The End

    View Slide