48
21

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

ElixirAdvent Calendar 2019

Day 17

OSSとしてのElixir

Last updated at Posted at 2019-12-17

この記事は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で学んだことにとても助けられました。

大変勉強になる会なのでみなさんもぜひ足を運んでみてはいかがしょうか。

明日のElixir Advent Calendar 2019 は、@masatam81さんによる記事となります。お楽しみに!

  1. 雑なPRをだしておいてお前が言うな案件なのですが、いくらWelcomingとはいえ甘え過ぎもやめましょう。Rubyのカンファレンスでの資料ですがOSSで結果を出す方法というスライドが参考になります。

48
21
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
48
21

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?