闘魂Elixir ── 10. Enum.sort

<b><font color="red">$\huge{元氣ですかーーーーッ！！！}$</font></b>

https://qiita.com/advent-calendar/2022

https://qiita.com/advent-calendar/2022/elixir

# はじめに

闘魂と[Elixir](https://elixir-lang.org/)が出会いました。
闘魂 meets [Elixir](https://elixir-lang.org/).です。
[Elixir](https://elixir-lang.org/) meets 闘魂.でもよいです。

本日は、[Enum.sort/2](https://hexdocs.pm/elixir/Enum.html#sort/2)を説明します。

```elixir
iex> "Elixir" |> String.graphemes() |> Enum.frequencies()
%{"E" => 1, "i" => 2, "l" => 1, "r" => 1, "x" => 1}
```

# [Enum.sort/2](https://hexdocs.pm/elixir/Enum.html#sort/2)

Enumerableなものの要素を並び替えた、あらたなEnumerableなものを作ってくれます。

言葉にするとなんだか難しいかもしれませんが、こちらの図をみてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131808/00ba42ec-8183-ca32-d129-1a3ef2e964ea.png)



上図の説明をします。[^1]
リスト`[5, 4, 3,2, 1]`をInputにしています。
[Enum.sort/2](https://hexdocs.pm/elixir/Enum.html#sort/2)を呼び出すと、並び替え（ソート）がそーっとできます。
どういう順番で並び替えるのかを`sorter`で指定します。ソーターです。[蒼太の包丁](https://ja.wikipedia.org/wiki/%E8%92%BC%E5%A4%AA%E3%81%AE%E5%8C%85%E4%B8%81_%E9%8A%80%E5%BA%A7%E3%83%BB%E6%9D%BF%E5%89%8D%E4%BF%AE%E6%A5%AD%E6%97%A5%E8%A8%98)ではありません。

`sorter`はあえて難しい書き方をしました。みんなそろそろ[Elixir](https://elixir-lang.org/) に慣れてきたところだとおもいますので。
以下のように書いても同じです。

## sorter 別のかきかた その①

```elixir
& &1 <= &2
```

## sorter 別のかきかた その②

```elixir
fn a, b -> a <= b end
```


[^1]: 図は、https://excalidraw.com/ を使って作成しています。スゴ腕ハッカーが書いたかのような手書き風の絵が書けるので最近の私のお気に入りツールです。

---

それでは、[IEx](https://hexdocs.pm/iex/IEx.html)で確かめてみましょう。

```:CMD
iex
```

[IEx](https://hexdocs.pm/iex/IEx.html)が立ち上がったら、以下のプログラムを実行してみてください。

```elixir
iex> sorter = &<=/2

iex> Enum.sort([5, 4, 3, 2, 1], sorter)
[1, 2, 3, 4, 5]
```

`[5, 4, 3, 2, 1]` => `[1, 2, 3, 4, 5]`の変換ができました:tada::tada::tada::tada::tada:


# ワンポイントレッスン

ワンポイントレッスンです。

## イミュータブル

[Elixir](https://elixir-lang.org/)の値はすべてイミュータブルです。
どういうことか説明しますね。

```elixir
iex> input = [5, 4, 3, 2, 1]
[5, 4, 3, 2, 1]

iex> output = Enum.sort(input, &<=/2)           
[1, 2, 3, 4, 5]
```

上記を実行したあと、`input`の値を確認してみましょう。

```elixir
iex> input
[5, 4, 3, 2, 1]
```

わかりますかね、`input`の値は変わらないのです。

疑り深いあなたのために `output`も出力しておきます。

```elixir
iex> output
[1, 2, 3, 4, 5]
```

これがなんの役に立つの？　とおもわれる方はいらっしゃるとおもいます。
ごめん、わたしにはちゃんと説明できません。
この性質があることで、Webアプリケーションの開発につきまとう様々な問題の回避策となったり、なによりも[Elixir](https://elixir-lang.org/)の利点として挙げられる高い並列処理の背景となっていたりします。

[イミュータブル](https://ja.wikipedia.org/wiki/%E3%82%A4%E3%83%9F%E3%83%A5%E3%83%BC%E3%82%BF%E3%83%96%E3%83%AB)


(どなたかマヂ編集リクエストをしていただくか、いい記事へのリンクを教えてください :pray: :pray_tone1::pray_tone2::pray_tone3::pray_tone4::pray_tone5: 。イミュータブルだー　って書き始めたけどわたしには上記くらいしか書けませんでした)

---

### 2022-12-18 追記

読者の方からお便りをいただきました。
[イミュータブル](https://ja.wikipedia.org/wiki/%E3%82%A4%E3%83%9F%E3%83%A5%E3%83%BC%E3%82%BF%E3%83%96%E3%83%AB)についてよくまとまっている[記事（動画）](https://techlib.circlearound.co.jp/entries/immutable/)がありましたのでご紹介しておきます。

https://techlib.circlearound.co.jp/entries/immutable/

<iframe width="500" height="315" src="https://www.youtube.com/embed/vgUrk_4Omwc" title="Immutable(イミュータブル)【コードで理解する】- プログラミング相談所オンライン" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

こちらの[記事（動画）](https://techlib.circlearound.co.jp/entries/immutable/)では、TypeScriptを例にしてイミュータブルなクラスとミュータブルなクラスで説明が展開されています。
結論として、[イミュータブル](https://ja.wikipedia.org/wiki/%E3%82%A4%E3%83%9F%E3%83%A5%E3%83%BC%E3%82%BF%E3%83%96%E3%83%AB)いいぞという内容です。
[Elixir](https://elixir-lang.org/)は言語仕様のレベルですべて[イミュータブル](https://ja.wikipedia.org/wiki/%E3%82%A4%E3%83%9F%E3%83%A5%E3%83%BC%E3%82%BF%E3%83%96%E3%83%AB)です。ですから、 **[Elixir](https://elixir-lang.org/)はいいぞー！ コノヤロー!!!**　というわけです。

@mokichi さん、[コメント](https://qiita.com/torifukukaiou/items/63ccbead795d56636ee8#comment-0e997fcc2355ba349bb9)ありがとうございます！！！


# 異なる型でも大小比較が可能

[Elixir](https://elixir-lang.org/)の言語仕様です。

```elixir
iex> "100" < 1000000000
false
```

文字列を数値とみなして比較するとかそういう話じゃありません。
データの型に大小関係が定義されています。

[Term ordering](https://hexdocs.pm/elixir/operators.html#term-ordering)に詳しく書いてあります。

```elixir
iex> 1 < :an_atom
true
```

```
number < atom < reference < function < port < pid < tuple < map < list < bitstring
```

これが何の役に立つのかは、なにかありました。どこかで聞いたか自分で発見したかしたことがあるのですが、忘れました。
ここもどなたか、ナイスな編集リクエストをお待ちしております。[Term ordering](https://hexdocs.pm/elixir/operators.html#term-ordering)が一体何の役に立つのかお便りをお待ちしております。









# 今日の<font color="#d00080">闘魂</font>

今日は、『孟子』から言葉を引きます。

---
天の<ruby>将<rt>まさ</rt></ruby>に大任を<ruby>是<rt>こ</rt></ruby>の人に降さんとするや、必ず<ruby>先<rt>ま</rt></ruby>ず其の<ruby>心志<rt>しんし</rt></ruby>を苦しめ、其の<ruby>筋骨<rt>きんこつ</rt></ruby>を労せしめ、其の<ruby>体膚<rt>たいふ</rt></ruby>を<ruby>餓<rt>う</rt></ruby>えしめ、其の身を<ruby>空乏<rt>くうぼう</rt></ruby>せしめ、其の為さんとする所に<ruby>払乱<rt>ふつらん</rt></ruby>せしむ
---

解説は、[こちら](https://www.bizclip.ntt-west.co.jp/articles/bcl00006-005.html)をご参照ください。

猪木さん流に言うと、「道はどんなに険しくとも、笑いながら歩こうぜ」ということです。
破壊王橋本真也選手流に言うと、四字熟語「道険笑歩」です。
:book:『[アントニオ猪木　最後の闘魂](https://presidentstore.jp/item/008105.html)』:book:より引用します。


> 長い人生、その道のりはけっして平坦ではない。むしろ、人生とは険しい道の連続なのかもしれない。だからといって、いつも「つらい、苦しい、もうやめたい……」と嘆いてばかりいても事態は好転しない。逆に暗い気持ちばかりが先に立って、状況はさらに悪化することもあるだろう。だからこそわたしは、人生において明るいこと、楽しいこと、嬉しいことばかりを考えてきた。そこに笑いがあれば、苦しい事態も好転するのではないか？　プラス思考でいれば、ネガティブな感情が入り込む余地はなくなるはずだ。

志（夢）を持ち、その志（夢）の実現のため、一歩踏み出す ーー **元氣があればなんでもできる！**　なのです。
元氣、やる氣や氣力、氣骨は時には、挫けそうになる時があります。
その氣を支えるのが、志（夢）です。
「志は氣の帥なり」と「元氣があればなんでもできる！」は２つで１つのことを言っているのです。

そうはいっても、志（夢）の達成には険しい道が続きます。それは天があなたに与えてくれた試練です。途中であきらめてよいのですか。途中であきらめていいようなものは、「志（夢）」とは言えません。人生は長くありません。すぐに次のことへ一歩を踏み出したほうがいいかもしれませんし、「石の上にも三年」ともいいます。どちらを選ぶのかはあなたの決断です。自己責任です。自分で決めてください。人のせいにしない。「己に克つ」ということです。つまりは「闘魂」です。この漢字を手で書いてみてください。ファイトが湧いてきます！

:book:『[アントニオ猪木　最後の闘魂](https://presidentstore.jp/item/008105.html)』:book:
みなさまもぜひこの本をお手にとられて、猪木さんが残されたメッセージを通じて、直接猪木さんから「元氣」をもらってください。

https://presidentstore.jp/item/008105.html

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131808/be8933f5-e3e2-d5f4-1561-f65f75abdf38.png)


# さいごに

[Enum.sort/2](https://hexdocs.pm/elixir/Enum.html#sort/2)を説明しました。

闘魂の意味は、 **「己に打ち克ち、闘いを通じて己の魂を磨いていくことである」** との猪木さんの言葉をそのまま胸に刻み込んでいます。
知っているだけで終わらせることなく、実行する、断行する、一歩を踏み出すことを自らの行動で示していきたいとおもいます。

<font color="red">$\huge{１、２、３ ぁっダー！}$</font>


<iframe width="910" height="512" src="https://www.youtube.com/embed/AWxwmqzbOaw" title="燃える闘魂 アントニオ猪木  追悼VTR" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

https://www.youtube.com/watch?v=FSz7N5hCltw

---

https://qiita.com/torifukukaiou/items/5e96f4e9f12ec3c4b3f4

---

# Twitter

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">Elixir Advent Calendar 3の10日目は、毎度お馴染み <a href="https://twitter.com/torifukukaiou?ref_src=twsrc%5Etfw">@torifukukaiou</a> さんのEnumシリーズ5つ目、sortです😌<a href="https://t.co/tzXxt5p2Yh">https://t.co/tzXxt5p2Yh</a><br><br>関数型言語や、分散・並行処理を支える上で重要な概念である「イミュータブル」についても解説されてま…いや、解説されてなかった😅 <a href="https://t.co/kKZMueJPWj">pic.twitter.com/kKZMueJPWj</a></p>&mdash; piacere (love Elixir, Gravity and VR/AR/Metaverse) (@piacere_ex) <a href="https://twitter.com/piacere_ex/status/1601436511337340928?ref_src=twsrc%5Etfw">December 10, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

---

<b><font color="red">$\huge{元氣があればなんでもできる！}$</font></b>