$\huge{元氣ですかーーーーッ!!!}$
はじめに
闘魂とElixirが出会いました。
闘魂 meets Elixir.です。
Elixir meets 闘魂.でもよいです。
本日は、Enum.sort/2を説明します。
iex> "Elixir" |> String.graphemes() |> Enum.frequencies()
%{"E" => 1, "i" => 2, "l" => 1, "r" => 1, "x" => 1}
Enum.sort/2
Enumerableなものの要素を並び替えた、あらたなEnumerableなものを作ってくれます。
言葉にするとなんだか難しいかもしれませんが、こちらの図をみてください。
上図の説明をします。1
リスト[5, 4, 3,2, 1]
をInputにしています。
Enum.sort/2を呼び出すと、並び替え(ソート)がそーっとできます。
どういう順番で並び替えるのかをsorter
で指定します。ソーターです。蒼太の包丁ではありません。
sorter
はあえて難しい書き方をしました。みんなそろそろElixir に慣れてきたところだとおもいますので。
以下のように書いても同じです。
sorter 別のかきかた その①
& &1 <= &2
sorter 別のかきかた その②
fn a, b -> a <= b end
それでは、IExで確かめてみましょう。
iex
IExが立ち上がったら、以下のプログラムを実行してみてください。
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]
の変換ができました
ワンポイントレッスン
ワンポイントレッスンです。
イミュータブル
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
の値を確認してみましょう。
iex> input
[5, 4, 3, 2, 1]
わかりますかね、input
の値は変わらないのです。
疑り深いあなたのために output
も出力しておきます。
iex> output
[1, 2, 3, 4, 5]
これがなんの役に立つの? とおもわれる方はいらっしゃるとおもいます。
ごめん、わたしにはちゃんと説明できません。
この性質があることで、Webアプリケーションの開発につきまとう様々な問題の回避策となったり、なによりもElixirの利点として挙げられる高い並列処理の背景となっていたりします。
(どなたかマヂ編集リクエストをしていただくか、いい記事へのリンクを教えてください 。イミュータブルだー って書き始めたけどわたしには上記くらいしか書けませんでした)
2022-12-18 追記
読者の方からお便りをいただきました。
イミュータブルについてよくまとまっている記事(動画)がありましたのでご紹介しておきます。
こちらの記事(動画)では、TypeScriptを例にしてイミュータブルなクラスとミュータブルなクラスで説明が展開されています。
結論として、イミュータブルいいぞという内容です。
Elixirは言語仕様のレベルですべてイミュータブルです。ですから、 Elixirはいいぞー! コノヤロー!!! というわけです。
異なる型でも大小比較が可能
Elixirの言語仕様です。
iex> "100" < 1000000000
false
文字列を数値とみなして比較するとかそういう話じゃありません。
データの型に大小関係が定義されています。
Term orderingに詳しく書いてあります。
iex> 1 < :an_atom
true
number < atom < reference < function < port < pid < tuple < map < list < bitstring
これが何の役に立つのかは、なにかありました。どこかで聞いたか自分で発見したかしたことがあるのですが、忘れました。
ここもどなたか、ナイスな編集リクエストをお待ちしております。Term orderingが一体何の役に立つのかお便りをお待ちしております。
今日の闘魂
今日は、『孟子』から言葉を引きます。
天の将に大任を是の人に降さんとするや、必ず先ず其の心志を苦しめ、其の筋骨を労せしめ、其の体膚を餓えしめ、其の身を空乏せしめ、其の為さんとする所に払乱せしむ
解説は、こちらをご参照ください。
猪木さん流に言うと、「道はどんなに険しくとも、笑いながら歩こうぜ」ということです。
破壊王橋本真也選手流に言うと、四字熟語「道険笑歩」です。
『アントニオ猪木 最後の闘魂』より引用します。
長い人生、その道のりはけっして平坦ではない。むしろ、人生とは険しい道の連続なのかもしれない。だからといって、いつも「つらい、苦しい、もうやめたい……」と嘆いてばかりいても事態は好転しない。逆に暗い気持ちばかりが先に立って、状況はさらに悪化することもあるだろう。だからこそわたしは、人生において明るいこと、楽しいこと、嬉しいことばかりを考えてきた。そこに笑いがあれば、苦しい事態も好転するのではないか? プラス思考でいれば、ネガティブな感情が入り込む余地はなくなるはずだ。
志(夢)を持ち、その志(夢)の実現のため、一歩踏み出す ーー 元氣があればなんでもできる! なのです。
元氣、やる氣や氣力、氣骨は時には、挫けそうになる時があります。
その氣を支えるのが、志(夢)です。
「志は氣の帥なり」と「元氣があればなんでもできる!」は2つで1つのことを言っているのです。
そうはいっても、志(夢)の達成には険しい道が続きます。それは天があなたに与えてくれた試練です。途中であきらめてよいのですか。途中であきらめていいようなものは、「志(夢)」とは言えません。人生は長くありません。すぐに次のことへ一歩を踏み出したほうがいいかもしれませんし、「石の上にも三年」ともいいます。どちらを選ぶのかはあなたの決断です。自己責任です。自分で決めてください。人のせいにしない。「己に克つ」ということです。つまりは「闘魂」です。この漢字を手で書いてみてください。ファイトが湧いてきます!
『アントニオ猪木 最後の闘魂』
みなさまもぜひこの本をお手にとられて、猪木さんが残されたメッセージを通じて、直接猪木さんから「元氣」をもらってください。
さいごに
Enum.sort/2を説明しました。
闘魂の意味は、 「己に打ち克ち、闘いを通じて己の魂を磨いていくことである」 との猪木さんの言葉をそのまま胸に刻み込んでいます。
知っているだけで終わらせることなく、実行する、断行する、一歩を踏み出すことを自らの行動で示していきたいとおもいます。
$\huge{1、2、3 ぁっダー!}$
Elixir Advent Calendar 3の10日目は、毎度お馴染み @torifukukaiou さんのEnumシリーズ5つ目、sortです😌https://t.co/tzXxt5p2Yh
— piacere (love Elixir, Gravity and VR/AR/Metaverse) (@piacere_ex) December 10, 2022
関数型言語や、分散・並行処理を支える上で重要な概念である「イミュータブル」についても解説されてま…いや、解説されてなかった😅 pic.twitter.com/kKZMueJPWj
$\huge{元氣があればなんでもできる!}$
-
図は、https://excalidraw.com/ を使って作成しています。スゴ腕ハッカーが書いたかのような手書き風の絵が書けるので最近の私のお気に入りツールです。 ↩