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

10min_elixir

8zca
February 25, 2020

 10min_elixir

社内発表資料

8zca

February 25, 2020
Tweet

More Decks by 8zca

Other Decks in Programming

Transcript

  1. Erlang • 並行処理、分散処理向けの関数型言語 • Ericsson社が1986年にリリース、1988年にOSS化 • 特徴 ◦ 分散環境 ◦

    障害耐性 ◦ リアルタイム ◦ 無停止 • 軽量プロセス ◦ OSのプロセスとは別物であり、 Erlang VMにより管理される ▪ 1プロセス309ワード ◦ 2011ごろのマシン(2GHz Core2Duo/4GB RAM)で数十万のプロセスを生成することが可能 • voluntasさんの資料がわかりやすい ◦ http://bit.ly/naze-erlang
  2. OTP(Open Telecom Platform) • Erlang 用のアプリケーション開発プラットフォーム・開発環境 ◦ コンパイラ ◦ インタプリタ

    ◦ データベースサーバ ◦ 解析 • Erlangが電気通信プロジェクトに用いられることからはじまったため、名前に Telecomが入ったままになっている • 2020/2時点での最新は Erlang/OTP 22 ◦ 1年に1回メジャーバージョンあがるらしい
  3. Elixir • RailsのコミッターであるJose Valim氏によって2012年に登場 • 採用事例(Erlang含む) ◦ gumi ◦ ミクシィ

    ◦ アカツキ ◦ ドリコム ◦ Whatsapp ▪ 1台のサーバで200万プロセス • ゲーム会社が多い。同時接続を安定して捌ける
  4. パターンマッチ • a = 1 ◦ = は正確には代入ではない。 aを1に束縛させている(マッチさせる) ◦

    便宜上代入と呼ぶ • list = [1, 2, 3] • [1, b, 3] = [1, 2, 3] • [1, b, 4] = [1, 2, 3] ◦ これはマッチしないので例外が発生する • [ _, 2, 3] = [1, 2, 3] ◦ _ がつくと任意のものにマッチ • {:ok, message} = something() ◦ somethingが {:ok, 処理結果}を返す場合で正常系のみハンドリングをする場合 • [head | tail] = [1, 2, 3] ◦ head = 1, tail = [2, 3]
  5. 無名関数 • fizzbuzzの例 • パラメータと処理をアローでつなげる • ドットをつけてコールする • remは余りを求める関数 fizzbuzz_judge

    = fn 0, 0, _ -> "FizzBuzz" 0, _, _ -> "Fizz" _, 0, _ -> "Buzz" _, _, c -> c end fizzbuzz = fn n -> fizzbuzz_judge.(rem(n, 3), rem(n, 5), n) end IO.inspect(fizzbuzz.( 10))
  6. 再帰 • 指定された数までの総和 • 1行で書く場合はdef name(), do: 処理 • 引数でマッチさせて関数を分岐することがで

    きる • moduleで関数群を1つのスコープにまとめ ることができる defmodule Sum do def of(0), do: 1 def of(n), do: n + of(n- 1) end IO.inspect(Sum.of(100))
  7. ガード節 • 与えられた配列から最大値を求める • whenで条件を加えられる • defpはprivate • 基本的にはEnum.mapというコレク ションを扱うmodule使おう

    defmodule MyList do def max([head | tail]), do: _max(tail, head) defp _max([], value), do: value defp _max([head | tail], value) when head > value do _max(tail, head) end defp _max([ _head | tail], value) do _max(tail, value) end end IO.inspect(MyList.max([1, 100, 2, 5]))
  8. パイプライン • |> で前回の結果を今回の関数の第1引数に入れ ることができる "1,234 " |> String.trim() |>

    String.sprit(",") アリティ • ドキュメントに sprit/1 のように /数字 で書かれている • これは引数の数(同じ関数でも引数が違うことに注意)