Erlangで湯婆婆を実装してみる

# はじめに
- @Nemesis さんの[Javaで湯婆婆を実装してみる](https://qiita.com/Nemesis/items/c7192a7c510788d2cba2)を拝見しまして、私は[Erlang](https://www.erlang.org/)でやってみようとおもいました
    - [Erlang](https://www.erlang.org/)は`23.0.1`を使いました
- [Elixir](https://elixir-lang.org/)は、2019/01/25(金)に行われた[kokura.ex#1：小倉Elixirコミュニティ発足](https://fukuokaex.connpass.com/event/116855/)からの付き合いなのですが、[Erlang](https://www.erlang.org/)を書いてみるのははじめてです
    - [Elixir](https://elixir-lang.org/)は、[Erlang](https://www.erlang.org/) VM (アーラン ブイエム) という仮想機械(VM)上で動いています
    - [Elixir](https://elixir-lang.org/)のことを父は[Erlang](https://www.erlang.org/)で、母が[Ruby](https://www.ruby-lang.org/ja/)[^1]とたとえるのは言い得て妙[^2]だとおもいます
- ということで、私と同じように[Elixir](https://elixir-lang.org/)は触ったことあるけど、[Erlang](https://www.erlang.org/)はたまに`:math.sqrt/1`等を[Elixir](https://elixir-lang.org/)から使ったことがあるだけで、ほとんどその存在を意識したことがない方に読んでいただけると一番理解していただける内容ではないかとおもっております
- もちろん、[令和のHello World!](https://qiita.com/everylittle/items/aae58c241194c0e5f515#%E3%81%AF%E3%81%98%E3%82%81%E3%81%AB)としてもお読みいただけるとおもいます
- 私はこれまで以下の[湯婆婆記事](https://qiita.com/tags/%e6%b9%af%e5%a9%86%e5%a9%86)を書きました
    - [Elixirで湯婆婆を実装してみる](https://qiita.com/torifukukaiou/items/daec6de40a54978dccc9)
    - [Phoenixで湯婆婆を実装してみる](https://qiita.com/torifukukaiou/items/43f50cb6abab40d4e7d1)
    - [Nervesで湯婆婆を実装してみる](https://qiita.com/torifukukaiou/items/5f68fbc1b151b137d5d1)
    - [【毎日自動更新】湯婆婆 LGTMランキング！](https://qiita.com/torifukukaiou/items/c8361231cdc56e493245)
- 2020/11/14(土)に開催された[kokura.ex#15：Elixirもくもく会～入門もあるよ](https://fukuokaex.connpass.com/event/193563/) での成果です
    - @im_miolab さん、ありがとうございます！

[^1]: [Elixir](https://elixir-lang.org/)の文法といいますか書き味は、[Ruby](https://www.ruby-lang.org/ja/)によく似ています
[^2]: すみません、オリジナルがどこにあるのかわかっていません


# 0. 準備
- まずは[Erlang](https://www.erlang.org/)をインストールしましょう
- 私は[asdf](https://asdf-vm.com/#/)を使ってインストールしました
- 手前味噌な記事ですが[インストール](https://qiita.com/torifukukaiou/items/d04d0273749c41eb50af#0-%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB)などをご参照ください


# 1. プログラムを書く

- 拡張子は`.erl`です
- 公式の[2 Sequential Programming](https://erlang.org/doc/getting_started/seq_prog.html)を主として参考にしながら書いてみました
- [名前を奪う](https://qiita.com/Nemesis/items/c7192a7c510788d2cba2#%E5%90%8D%E5%89%8D%E3%82%92%E5%A5%AA%E3%81%86)は、`erlang list random`で検索をして出てきた[Pick a random element from a list](https://www.programming-idioms.org/idiom/11/pick-a-random-element-from-a-list/1123/erlang)を参考にしました

```erlang:yubaba.erl
-module(yubaba).
-export([main/0]).

main() ->
    InName = io:get_line("契約書だよ。そこに名前を書きな。\n"),
    Name = string:trim(InName),
    io:format("フン。~tsというのかい。贅沢な名だねぇ。\n", [Name]),
    NewName = lists:nth(rand:uniform(length(Name)), Name),
    io:format("今からお前の名前は~tsだ。いいかい、~tsだよ。分かったら返事をするんだ、~ts!!\n", [[NewName], [NewName], [NewName]]).

```

- [Elixir](https://elixir-lang.org/)に慣れている方であれば、雰囲気で感じ取れるのではないでしょうか


# 2. 実行
- `erl`コマンドを使います

## 名前を入力する

```erlang
$ erl
Erlang/OTP 23 [erts-11.0.1] [source] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:1] [hipe]

Eshell V11.0.1  (abort with ^G)
1> c('yubaba').
{ok,yubaba}
2> yubaba:main().
契約書だよ。そこに名前を書きな。
山田太郎
フン。山田太郎というのかい。贅沢な名だねぇ。
今からお前の名前は太だ。いいかい、太だよ。分かったら返事をするんだ、太!!
ok
3> halt().
```
- :tada::tada::tada: 

## 名前を入力しない

```erlang
$ erl
Erlang/OTP 23 [erts-11.0.1] [source] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:1] [hipe]

Eshell V11.0.1  (abort with ^G)
1> c('yubaba').
{ok,yubaba}
2> yubaba:main().
契約書だよ。そこに名前を書きな。

フン。というのかい。贅沢な名だねぇ。
** exception error: no function clause matching rand:uniform_s(0,
                                                               {#{bits => 58,jump => #Fun<rand.3.47293030>,
                                                                  next => #Fun<rand.0.47293030>,type => exsss,
                                                                  uniform => #Fun<rand.1.47293030>,
                                                                  uniform_n => #Fun<rand.2.47293030>},
                                                                [114110547653821498|245986615844275301]}) (rand.erl, line 326)
     in function  rand:uniform/1 (rand.erl, line 299)
     in call from yubaba:main/0 (yubaba.erl, line 8)
3> halt().
```

- 何も入力しない場合にエラーになってしまう件は[本家](https://qiita.com/Nemesis/items/c7192a7c510788d2cba2)と同じくです :thumbsup: 

# Wrapping Up :lgtm: :qiita-fabicon: :lgtm:
- [Elixir](https://elixir-lang.org/)を書いているときに、いつもお世話になっています！
- とにかく[Erlang](https://www.erlang.org/)で書いてみました
- 感覚的なものですが、**硬派**という言葉がぴったりの印象を持ちました
    - **漢**を感じさせてくれる言語です
- Enjoy [Erlang](https://www.erlang.org/) !!! :rocket::rocket::rocket: