Elixirイー！！！

**小倉山峰のもみぢ葉心あらば今ひとたびのみゆき待たなむ**

Advent Calendar 2022 76日目[^1]の記事です。
I'm looking forward to 12/25,2022 :santa::santa_tone1::santa_tone2::santa_tone3::santa_tone4::santa_tone5:
私の[Advent Calendar 2022 一覧](https://docs.google.com/spreadsheets/d/1HQvFjagQLRPjOYAjDVzWp9S4b8dKixxvvaz_TtbZWto/edit#gid=1723448955)。

[^1]: @kaizen_nagoya さんの「[「@e99h2121 アドベントカレンダーではありますまいか Advent Calendar 2020」の改訂版ではありますまいか Advent Calendar 2022 １日目　Most Breakthrough Generator](https://qiita.com/kaizen_nagoya/items/49ebebee3a0377f3b59b)」から着想を得て、模倣いたしました。 

---



# はじめに

[Elixir](https://elixir-lang.org/)を楽しんでいますか:bangbang::bangbang::bangbang:

TwitterでRubyのワンライナーをみました。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">ruby -e &#39;puts &quot;いい国作ろう#{%w(キャバクラ 鎌倉).sample}幕府&quot;&#39;</p>&mdash; mattn (@mattn_jp) <a href="https://twitter.com/mattn_jp/status/1504850216335585281?ref_src=twsrc%5Etfw">March 18, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


私は、[Elixir](https://elixir-lang.org/)で楽しんでみようとおもいます。


# 実行（Ruby編）

まずは兄貴分のRubyを実行してみます。


```ruby
$ ruby -e 'puts "いい国作ろう#{%w(キャバクラ 鎌倉).sample}幕府"'
いい国作ろうキャバクラ幕府

$ ruby -e 'puts "いい国作ろう#{%w(キャバクラ 鎌倉).sample}幕府"'
いい国作ろうキャバクラ幕府
```

あれ？　`鎌倉幕府`にならない？？？
気を取り直して、

```ruby
$ ruby -e 'puts "いい国作ろう#{%w(キャバクラ 鎌倉).sample}幕府"'
いい国作ろう鎌倉幕府
```

:tada::tada::tada:
だよね！
`%w(キャバクラ 鎌倉).sample`が肝で、`'キャバクラ'`か`'鎌倉'`が選ばれるわけです。

## Rubyは、[Elixir](https://elixir-lang.org/)の兄貴？

Rubyは、[Elixir](https://elixir-lang.org/)の兄貴と言って過言ではないとおもいます。
兄弟船です。
[波の谷間に命の花が　ふたつ並んで咲いている♪](https://www.youtube.com/watch?v=qngfuRrOO_I)

<iframe width="891" height="501" src="https://www.youtube.com/embed/qngfuRrOO_I" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>


[Elixir](https://elixir-lang.org/)の作者[José Valim](https://twitter.com/josevalim)さんは、 https://cognitect.com/cognicast/120 の中で`Then in 2012 was when we started to work on the Elixir that we have today. The main, the top three influences are Erlang, Ruby, and Clojure.`と発言されています。

## 鳥羽一郎さん

余談ですが、私は兄弟船を歌われている鳥羽一郎さんが、厳島神社のある宮島で植樹をされたという立て札をみたことがあります。
私は大興奮しました。
文字通りの**大興奮**です。
こんなにテンションが上がったのは人生にもう一度あるかないかくらいです。
鳥羽一郎さんの話はこのくらいにしておきます。


その当時の興奮をおもいだしました。
興奮そのままに書きたいことが増えたので続けます。

## 楽しむ

YouTubeの動画を埋め込んでみたところ奇しくも「楽な暮らしを　させたくて」と表示されています。
「兄弟船」の世界感とその歌詞の文脈とは「楽」の意味が異なりますが、「[Elixir](https://elixir-lang.org/)は、『プログラミングは楽しいモノだと改めておもいださせてくれた言語』」です。

おもいだしました。
わたしは以前、[まつもとゆきひろ](https://twitter.com/yukihiro_matz)さんの前でLTをしたことがあります。
そのときに「Rubyは、『プログラミングは楽しいモノだと改めておもいださせてくれた言語です』」と告白をして、LTを締めました。
その後、しっかりと[まつもとゆきひろ](https://twitter.com/yukihiro_matz)さんのサインをいただきました。
家宝です。
この場をお借りして、御礼申し上げます。
ありがとうございます。

論語には「知好楽」という一節があります。

> 之を知る者は、之を好む者に如かず。之を好む者は、之を樂しむ者に如かず。

楽しんでいきましょう！
ついつい「がんばります！」と言いがちなのですが、「がんばります！」と力を込めることはたいてい長続きしません。
私は、４０歳をすぎてやっとわかりました。
私は、「がんばります！」と言いそうになったら、ぐっとこらえて「楽しんでいます！」ということにしています。
（決して「がんばって」はいません！　「楽しんでいます！」というのを「がんばって」言っているわけではなく、「楽しんで」言っています！）


## A PROGRAMMER'S BEST FRIEND

ここからは私の持論です。
[Elixir](https://elixir-lang.org/)は、海外、国内ともにコミュニティがあたたかいです。
[Elixir](https://elixir-lang.org/)がRubyの影響を色濃く受けているところは、親しみやすい文法はもちろんのこと`A PROGRAMMER'S BEST FRIEND`なのだとおもっています。
[Elixir](https://elixir-lang.org/)もまた`A PROGRAMMER'S BEST FRIEND`です。

`A PROGRAMMER'S BEST FRIEND`というのは、 https://www.ruby-lang.org/ をご覧になってください。
ページの左上に書いてあります。




# [Elixir](https://elixir-lang.org/)で書く

前置きが長くなりました。
この記事のハイライトです。
[Elixir](https://elixir-lang.org/)で書いてみます。

```elixir
$ elixir -e '~w[キャバクラ 鎌倉] |> Enum.random() |> then(&"いい国作ろう#{&1}幕府") |> IO.puts'
```

[Elixir](https://elixir-lang.org/) 1.12 or laterを使ってください。

[Elixir](https://elixir-lang.org/)とまだ馴染みがない方のために説明を書きます。

- [then/2](https://hexdocs.pm/elixir/Kernel.html#then/2)が、1.12からです
- `~w`は、 https://hexdocs.pm/elixir/Kernel.html#sigil_w/2 に説明がある通り、Stringのリストを作ってくれます
- [Enum.random/1](https://hexdocs.pm/elixir/Enum.html#random/1)は、リストの中から任意の一要素を選んでくれます
- [|>](https://hexdocs.pm/elixir/Kernel.html#%7C%3E/2)は、Pipe operatorと呼ばれるものでして、前の計算結果を次の関数の第一引数にいれて次の関数を実行してくれる、まさしくすべからく畢竟パイプです
- `elixir -e '...'`と実行するところなんて、`ruby -e '...'`を彷彿とさせますね


## 読者の方からお便りをいただきました

@mnishiguchi さんからお便りをいただきました。
こういうふうに、`IO.puts`の引数にリストを使う書き方ができます。

```elixir
elixir -e '~w[キャバクラ 鎌倉] |> Enum.random() |> then(&["いい国作ろう", &1, "幕府"]) |> IO.puts'
```

参考リンクを教えていただきました。
ご紹介しておきます。

https://nathanmlong.com/2021/05/what-is-an-iolist/

@mnishiguchi さん、ありがとうございます！


---

# Wrapping up :lgtm::lgtm::lgtm::lgtm::lgtm:

この記事は、`elixir -e '~w[キャバクラ 鎌倉] |> Enum.random() |> then(&"いい国作ろう#{&1}幕府") |> IO.puts'`を書きました。

鳥羽一郎さんの話が当初の予定よりも長くなりました。
予定はその通りにいかないからおもしろい ーー 「そこがいいんじゃない」です。
私はこの記事を書くことをとても楽しみました。

`elixir -e '...'`、[Elixir](https://elixir-lang.org/)はイー（良）！！！　です


Enjoy [Elixir](https://elixir-lang.org/):bangbang::bangbang::bangbang:
<font color="purple">$\huge{Enjoy\ Elixir🚀}$</font>


以上です。





---

I organize [autoracex](https://autoracex.connpass.com/).
And I take part in [NervesJP](https://nerves-jp.connpass.com/), [fukuoka.ex](https://fukuokaex.connpass.com/), [EDI](https://fukuokaex.connpass.com/), [tokyo.ex](https://beam-lang.connpass.com/), [Pelemay](https://pelemay.connpass.com/).
I hope someday you'll join us.

[We Are The Alchemists, my friends!](https://www.youtube.com/watch?v=04854XqcfCY)