はじめに
- @Nemesis さんのJavaで湯婆婆を実装してみるを拝見しまして、私はElixirでやってみようとおもいました
-
Elixir はじめてな方に向けて書いています
- といいつつ、私自身は多少、毛が生えてきた程度の素人でございます
- Elixirの意味は、不老不死の霊薬です
- a magic liquid that is believed to cure illnesses or to make people live forever
0. 準備
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つ作っています- パターンマッチと呼ばれる仕掛けで最初にマッチしたほうの関数が実行されます
- 空文字列
""
とそれ以外でわけてみました
-
defp
のp
はprivate
のピ〜です(そもそも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