tokyo.ex#13 elixir本体ソースコードもくもくリード会に参加してEnum.tally書いてみた
「tokyo.ex #13 elixir本体ソースコードもくもくリード会」に参加してきました。
Elixirのソースコードを事前にcloneしておいてMakefileなんかを見ながらエリクサーのコンパイルの流れを解説していただきました。
Makefile is 何?から解説してくださっている発表もありElixir以前の段階で勉強になりました。
ですです。
— ハヤブサ@連勤術士 (@hayabusa333) September 29, 2019
lib/elixir/src/elixir.app.src に、elixir . app を作る前のテンプレートがあって、ごにょごにょされて
lib/elixir/ebin/elixir.app に出力されております。
ふんわり理解をつぶやいたら登壇者の@hayabusa333氏に補足してもらえました。ありがとうございます!
もくもく会
実際のもくもく会の内容は「Elixirのバージョンを書き換えよう」と「標準モジュールの追加」の2つがありました。
Elixirのバージョンを書き換えよう
ElixirのversionはrootディレクトリのVERSIONというファイルに記載されているのでこれを書き換えてmakeすればok
やった!Elixirのversionハックできたぞ!!
— とるめん (@qwyngg) September 29, 2019
#tokyoex pic.twitter.com/41VVqUPy9U
実際にmakeしてみると
~~~~~~ Recompile: src/elixir_aliases Recompile: src/elixir Generated elixir.app ==> bootstrap (compile) Compiled lib/elixir/lib/kernel.ex Compiled lib/elixir/lib/macro/env.ex ~~~~~~
スライドどおりelixir.appが作成されてbootsrapという関数が実行されているのがわかりますね。
標準モジュールの追加
標準モジュールの追加ですが、自分はモジュールの追加ではなく組み込みモジュールのEnumに関数を一つ追加しました。Rubyで新しく実装されたtallyです。単にtallyが好きで書きたかっただけ
標準ライブラリのEnumにRubyのtally生やしてみました
— とるめん (@qwyngg) September 29, 2019
#tokyoex pic.twitter.com/btsXYQv8Ln
ソースコードはこんな感じです。
def tally(enumerable, func \\ fn x -> x end) do group_by(enumerable, func) |> map(fn {key, val} -> {key, count(val)} end) |> Map.new end
ちょっと例外までは考えきれてないんですが現状のElixirの知見で書いてみました。*1
せっかくなのでテストもElixir本体に書いてみました。
test "tally/2" do assert Enum.tally(~w{a a a b c c}) == %{"a" => 3, "b" => 1, "c" => 2} assert Enum.tally(~w{aa aA bb cc}, fn x -> String.downcase(x) end) == %{"aa" => 2, "bb" => 1, "cc" => 1} end
Elixir本体のテストはコンパイルしたら直接ファイル指定して実行できます。*2
> bin/elixir lib/elixir/test/elixir/enum_test.exs Excluding tags: [windows: true] ...................................................................................................................................................................................................................................................................................................................................................... Finished in 2.0 seconds (1.9s on load, 0.05s on tests) 180 doctests, 162 tests, 0 failures Randomized with seed 313260
けっこう便利なメソッドだしドキュメントちゃんと書いてElixirにPR出してみようかなとか思ってます。 Elixirがこういうメソッドどう考えてるのかはわかりませんが。
Elixirコミュニティについて感じたこと
福岡を中心に西日本で盛り上がってるみたいですね。Rubyも福岡は元気なイメージだし福岡熱い。
Rubyの勉強会にいくとほとんどの方がwebエンジニアという印象ですが、Elixirでは組み込みやゲーム領域のエンジニアの方もいて新鮮でした。ゲームとか組み込みとかとの親和性もElixirの魅力ですね。
感想
とても楽しい勉強会でした。主催者の方、参加者の方、会場を提供していただいた株式会社ドリコム様ありがとうございました!
*1:もっといい書き方あるで!という方ぜひ教えてください:pray: