Edited at

Elixir Zen スタイルプログラミング講座


はじめに

みなさん,Elixir Zen スタイルでプログラミングしていますか?

え,「Elixir Zen スタイルって何?」ですと?!

そんな流行に乗り遅れている貴方,このプレゼンテーションを聴衆とともに笑いながら見てください!

Lonestar ElixirConf 2019 - Hastega: Challenge for GPGPU on Elixir - Susumu Yamazaki

英語はどうしても嫌だ!という人は,次のプレゼンテーションをどうぞ

WSAに最適化された並列処理系

というわけで,Elixir Zen スタイルを推し進めると,次のような良いことがあります!


  1. 再帰スタイルで書くよりも,プログラムがとっても読みやすくなります。

  2. 今私たちが頑張って実装している Hastega が実用になると,最速で実行してくれるようになります。

これが「魔法による禅と侍の調和」すなわち「侘び寂び」です。なんのことかわからない人は,前述の英語プレゼンテーションを見てくださいね!

というわけで,この記事では,Elixir Zen スタイルの数々のプログラム例を紹介します。2019年5月3日からほぼ毎日のように連続ツイートしているので,見てやってください。


Enum.reduce って何をしているの?

Enum.reduce([1, 2, 3], 0, fn x, acc -> M.func(x, acc) end)

0 # 第2引数
|> M.func(1) # 第3引数の関数
|> M.func(2)
|> M.func(3)


Enum.reduce/3 と Enum.map/2 の組合わせ

[1, 2, 3]

|> Enum.map(& &1 * 2)
|> Enum.reduce(0, fn x, acc -> x + acc end)


Elixir プログラミングでかっこが多重になりそうなときに,どうしたらいいか?

第1引数の中にカッコを書きたくなったら,パイプライン演算子を使え!

Enum.reduce(Enum.map(...), 0, fn x, acc -> end)

Enum.map(...)

Enum.reduce(0, fn x, acc -> x + acc end)


複数のリストの各要素ごとに積をとりたい

Enum.zip([1, 2, 3], [4, 5, 6])

|> Enum.map(& Tuple.to_list(&1))
|> Enum.map(& Enum.reduce(&1, 1, fn x, acc -> x * acc end))


長いリストを決められた個数ごとに分割したい

1..24

|> Enum.chunk_every(4)


To be continued...