LoginSignup
26
14

More than 3 years have passed since last update.

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

Last updated at Posted at 2020-11-04

はじめに

  • @Nemesis さんのJavaで湯婆婆を実装してみるを拝見しまして、私はElixirでやってみようとおもいました
  • Elixir はじめてな方に向けて書いています
    • といいつつ、私自身は多少、毛が生えてきた程度の素人でございます
    • Elixirの意味は、不老不死の霊薬です
    • a magic liquid that is believed to cure illnesses or to make people live forever

0. 準備

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

1. プロジェクト作成

$ mix new yubaba
$ cd yubaba
  • プロジェクトの雛形がつくられます
  • いっぱいファイルができます
  • Elixirがはじめての方はそんなものだと流してください
  • 慣れるといつもの景色にみえてきます

2. プログラムを書く

lib/yubaba.ex
defmodule Yubaba do
  def main do
    name = IO.gets("契約書だよ。そこに名前を書きな。\n") |> String.trim()

    IO.puts("フン。#{name}というのかい。贅沢な名だねぇ。")
    new_name = String.codepoints(name) |> Enum.random()

    IO.puts("今からお前の名前は#{new_name}だ。いいかい、#{new_name}だよ。分かったら返事をするんだ、#{new_name}!!")
  end
end
  • |>Pipe operatorと呼ばれるものでして、前の計算結果を次の関数の第一引数に入れて計算をしてくれます
  • 入力文字列から一文字を選ぶ(名前を奪う)ところは、String.codepoints/1関数で要素が1文字ずつのリストにして、そのリストの中から1要素を適当に選んでくれるEnum.random/1関数を使うことでnew_nameを求めています
    • String.codepoints(name) |> Enum.random()
  • Module.function/1なんていきなりさらっと書いていますが、/のうしろは引数の数です
    • Elixir界でよくみる表記方法です

3. 実行

$ iex -S mix

iex> Yubaba.main
契約書だよ。そこに名前を書きな。
山田太郎
フン。山田太郎というのかい。贅沢な名だねぇ。
今からお前の名前は太だ。いいかい、太だよ。分かったら返事をするんだ、太!!
:ok

iex> Yubaba.main
契約書だよ。そこに名前を書きな。

フン。というのかい。贅沢な名だねぇ。
** (Enum.EmptyError) empty error
    (elixir 1.10.4) lib/enum.ex:1999: Enum.random/1
    (yubaba 0.1.0) lib/yubaba.ex:24: Yubaba.main/0

iex> 
  • 何も入力しない場合にエラーになってしまう件は本家と同じくです

4. 改善(する必要はないのかもしれませんが)案

  • いろいろと方法はあるとおもいます
  • ここではYubaba.new_name/1関数を用意して入力値によって処理を変えてみることにします
  • Yubaba.new_name/1関数を2つ作っています
    • パターンマッチと呼ばれる仕掛けで最初にマッチしたほうの関数が実行されます
    • 空文字列""とそれ以外でわけてみました
  • defppprivateのピ〜です(そもそもdefを説明していませんが)
    • Yubabaモジュール内だけで使える関数です
lib/yubaba.ex
defmodule Yubaba do
  def main do
    name = IO.gets("契約書だよ。そこに名前を書きな。\n") |> String.trim()

    IO.puts("フン。#{name}というのかい。贅沢な名だねぇ。")
    new_name = new_name(name)

    IO.puts("今からお前の名前は#{new_name}だ。いいかい、#{new_name}だよ。分かったら返事をするんだ、#{new_name}!!")
  end

  defp new_name(""), do: ""

  defp new_name(name), do: String.codepoints(name) |> Enum.random()
end
  • IExを起動したままの場合はrecompileして再度実行してみてください

5. IExの終了

iex> System.halt

Wrapping Up :lgtm: :qiita-fabicon: :lgtm:

  • とにかくElixirで書いてみようと始めてみましたところ、実は奥深い題材だったようでElixirのけっこういろいろなことを紹介できた気がします
  • Elixirは、Enumモジュールと仲良くなれるとよいです
  • 何だってそうだとおもいますが、Elixirは特に、公式ドキュメントを読むのが一番よいです
    • 英語で書かれていますがたいてい実行例が書いてありますし、公式ドキュメントも各種ライブラリも同じ形式で書かれているので慣れるととても読みやすいです
  • Enjoy Elixir !!! :rocket::rocket::rocket:
26
14
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
26
14