tokyo.ex#13 elixir本体ソースコードもくもくリード会に参加してEnum.tally書いてみた

「tokyo.ex #13 elixir本体ソースコードもくもくリード会」に参加してきました。

beam-lang.connpass.com

Elixirのソースコードを事前にcloneしておいてMakefileなんかを見ながらエリクサーのコンパイルの流れを解説していただきました。

speakerdeck.com

speakerdeck.com

Makefile is 何?から解説してくださっている発表もありElixir以前の段階で勉強になりました。

ふんわり理解をつぶやいたら登壇者の@hayabusa333氏に補足してもらえました。ありがとうございます!

 もくもく会

実際のもくもく会の内容は「Elixirのバージョンを書き換えよう」と「標準モジュールの追加」の2つがありました。

Elixirのバージョンを書き換えよう

ElixirのversionはrootディレクトリのVERSIONというファイルに記載されているのでこれを書き換えてmakeすればok

実際に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が好きで書きたかっただけ

ソースコードはこんな感じです。

   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:

*2:https://github.com/elixir-lang/elixir#contributing