この記事はElixir Advent Calendar 2019 17日目の記事です
ElixirはOSSです。誰でもソースコードを見ることができます。同時に誰でもPRを送ることもできます。
この記事ではelixir-lang/elixirへの実際にPRをたてた時の流れと感じたことを書きたいと思います。
公式でコントリビュートにたいするガイドラインがあるのでPRやIssueを立てる時は必ず一読しましょう。
実際に行ったこと
###Proposalを出す
今回新機能の追加だったのでコアメーリングリストにProposalを出しました。(筆者はいきなりPRを出してメーリングリストに誘導されました。恥ずかしい)
実際に出したProposal
新しい関数の提案だったので、「なぜ標準ライブラリで行う必要があるのか」、「他の言語だとどうなっているのか」の説明を求められました。また名前についても多くの議論がありました。
elixir-lang/elixirの開発の流れの確認
elixir-lang/elixirでは
bin/elixirc lib/elixir/lib/string.ex -o lib/elixir/ebin
という形で変更したファイルを対象にコンパイルを行うことができます。
bin/elixir lib/elixir/test/elixir/string_test.exs
のようにテストを行うと良いでしょう。
コンパイル後はbin/iex
でiexを起動して動作の確認もできます。
###実際にPRをたてる
実際にたてたPR
ここで意識すると良いと思ったのはパフォーマンスを意識したコードです。
最初に僕が出した実装はこれです。
def frequencies_by(enumerable, func \\ fn x -> x end) do
group_by(enumerable, func)
|> map(fn {key, val} -> {key, count(val)} end)
|> Map.new()
end
関数名とか可読性は別としてこの実装だとgroup_byを使っているので全ての要素に二回アクセスしています。
PRを出して提案されたコードは以下
def frequencies_by(enumerable, key_fun \\ fn x -> x end) when is_function(key_fun) do
reduce(enumerable, %{}, fn entry, acc ->
key = key_fun.(entry)
Map.update(acc, key, 1, &(&1 + 1))
end)
この実装なら各要素へのアクセスは一回ですみます。
特にプログラミング言語や大きいOSSではパフォーマンスが重要です。
この後Map.update/4
の呼び出しもオーバーヘッドということで書き直したPRも出しています。
以上が実際にPRをたてた時の手順です。
実際にmergeされたのでv 1.10から以下の2つの関数が生まれる…かも
iex> Enum.frequencies(~w{ant buffalo ant ant buffalo dingo})
%{"ant" => 3, "buffalo" => 2, "dingo" => 1}
iex> Enum.frequencies_by(~w{aa aA bb cc}, &String.downcase/1)
%{"aa" => 2, "bb" => 1, "cc" => 1}
Elixir is very welcoming
ここまで偉そうなことかきましたが筆者は業務でElixirを書いたこともなくプログラミングElixirを読んだだけのレベルです。
ですがElixirはシンプルな文法で公式Webページも充実しており「始めやすさ」に優れた言語だと感じました。
作者であるJosé Valim氏のインタビュー動画でもおっしゃられていたのですが、Elixirは言語として「very welcoming」であることを大事にしているそうです。
今回のメーリングリストやPRでも
- Proposalに誘導してもらう
- Proposal内でも書くべき情報についてヒントをもらう
- PR内でのやりとり
等コミュニティとしての「very welcoming」を強く感じました。1
おわりに
今回PRを出すに当たり#tokyoexで学んだことにとても助けられました。
- 上から見るか下から見るか
- [Hacking Elixir How-To]
(https://speakerdeck.com/ohr486/hacking-elixir-how-to)
大変勉強になる会なのでみなさんもぜひ足を運んでみてはいかがしょうか。
明日のElixir Advent Calendar 2019 は、@masatam81さんによる記事となります。お楽しみに!
-
雑なPRをだしておいてお前が言うな案件なのですが、いくらWelcomingとはいえ甘え過ぎもやめましょう。Rubyのカンファレンスでの資料ですがOSSで結果を出す方法というスライドが参考になります。 ↩