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


はじめに

0. 準備

  • まずはErlangをインストールしましょう
  • 私はasdfを使ってインストールしました
  • 手前味噌な記事ですがインストールなどをご参照ください

1. プログラムを書く

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に慣れている方であれば、雰囲気で感じ取れるのではないでしょうか

2. 実行

  • erlコマンドを使います

名前を入力する

$ 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().

名前を入力しない

$ 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().
  • 何も入力しない場合にエラーになってしまう件は本家と同じくです

Wrapping Up

  • Elixirを書いているときに、いつもお世話になっています!
  • とにかくErlangで書いてみました
  • 感覚的なものですが、硬派という言葉がぴったりの印象を持ちました
    • を感じさせてくれる言語です
  • Enjoy Erlang !!!

  1. Elixirの文法といいますか書き味は、Rubyによく似ています 

  2. すみません、オリジナルがどこにあるのかわかっていません