elixirだ 第1回強化版 後半
TRANSCRIPT
Hex> Rubyにおけるrubygems > パッケージマネージャ > https://hex.pm > ErlangのライブラリもOK > ファイル構成見てよしなにシュッと
Mix project> lib/please.ex > test/ > please_test.exs > test_helper.exs
> config/config.exs > mix.exs
lib/please.exdefmodule Please do def give_me(:sushi), do: “🍣” def give_me(:beer), do: “🍺” def give_me(_other), do: “❓” end
テストライブラリ> ExUnit > とりあえずこれ覚えるべき
> ShouldI > Bruce Tateさん作 > “One Experiment, Multiple Measurements” > 中身はExUnit
> ESpec
test/please_test.exsdefmodule PleaseTest do use ExUnit.Case alias Please, as: Plz
test “sushi” do assert Plz.give_me(:sushi) == ”🍣” end
test “neither sushi nor beer” do assert Plz.give_me(:hoge) == ”❓” end end
Redも見ておきましょうdefmodule PleaseTest do use ExUnit.Case alias Please, as: Plz
test “sushi” do assert Plz.give_me(:sushi) == ”🍕” end
test “neither sushi nor beer” do assert Plz.give_me(:hoge) == ”❓” end end
Poison使おうdefp deps do [ # master使いたい {:poison, github: "devinus/poison"},
# 特定のbranch使いたい {:poison, github: "Joe-noh/poison", branch: "experimental"} ] end
tagとrefも使える
しれっと使える
defmodule Please do def pass_to_poison(arg) do Poison.decode(arg) end end
Please.pass_to_poison "{\"a\": 1}"
body recursive sum([1, 2, 3]) = 1 + sum([2, 3]) = 1 + 2 + sum([3]) = 1 + 2 + 3 + sum([]) = 1 + 2 + 3 + 0 = 6
body recursive
defmodule MyModule.Math do # ベースケース def sum([]), do: 0
def sum([h|t]), do: h + sum(t) end ↑
再帰から戻ってきた後にまだ仕事がある
tail recursive sum([1, 2, 3]) = sum([1, 2, 3], 0) = sum([2, 3], 0+1) = sum([3], 0+1+2) = sum([], 0+1+2+3) = 6
tail recursivedefmodule MyModule.Math do def sum(list), do: sum(list, 0)
# ベースケース defp sum([], acc), do: acc
defp sum([h|t], acc) do sum(t, acc+h) end end
↑ 再帰呼び出しが最後の仕事
簡易計測計算時間 [us/op]
1E+00
1E+01
1E+02
1E+03
1E+04
1E+05
1E+06
1E+07
要素数 n1E+043E+045E+041E+053E+055E+051E+063E+065E+06
body [us/op] tail [us/op]
body / tail実行時間比 (body/tail)
0.0
0.5
1.0
1.5
2.0
2.5
3.0
要素数 n1E+043E+045E+041E+053E+055E+051E+063E+065E+06
countdefmodule Please do def count(list) do count(list, 0) end
defp count([], acc), do: acc
defp count([_h|t], acc) do count(t, acc+1) end end
mapdefmodule Please do def map(list, f) do map(list, f, []) end
defp map([], _f, acc) do Enum.reverse acc end
defp map([h|t], f, acc) do map(t, f, [f.(h) | acc]) end end