基本的なデータ型

 cf. 2 基本的な型 – Basic types – Elixir

数値

数値型には整数と浮動小数点数がある。

iex(1)> 1 + 2
3
iex(2)> 5 * 5
25
iex(3)> 10 / 2
5.0

/ 演算子は必ず浮動小数点数を返す。整数の商や余りが必要なら、関数 div と rem が使える。

iex(4)> div(10, 2)
5
iex(5)> rem(10, 3)
1

真理値

truefalse が真理値。

iex(6)> true
true
iex(7)> true == false
false

関数 is_boolean/1 で真理値かどうかを判定できる。

iex(8)> is_boolean(false)
true
iex(9)> is_boolean(1)
false

アトム

アトムとは、それ自身の名前が値を表している定数。Ruby のシンボルのようなもの。

iex(10)> :hello
:hello
iex(11)> :hello == :world
fals

真理値 true と false も実はアトム。

iex(12)> is_atom(true)
true
iex(13)> is_atom(false)
true
iex(14)> true == :true
true

文字列

文字列は ” (二重引用符)で囲む。

iex(15)> "hello"
"hello"
iex(16)> "hello
...(16)> world"
"hello\nworld"

一昨日も書いたけど、文字列の中に自然に改行を入れられるのが新鮮。エスケープシーケンスも使える。

iex(17)> "hello\nworld"
"hello\nworld"

Ruby みたいな文字列の埋め込みもできる。

iex(18)> "hello #{:world}"
"hello world"

文字列を出力するには IO モジュールの IO.puts/1 関数。

iex(19)> IO.puts "hello"
hello
:ok

匿名関数

キーワード fn で始まり end で終わる。

iex(20)> add = fn a, b -> a + b end
#Function<12.52032458/2 in :erl_eval.expr/5>

Elixir では関数は”第一級市民”で、ほかのデータ型のように変数に代入することができる。is_function/1 に関数を渡すと true が返ってくる。fnend で作った関数を呼び出すには、関数名と引数リストの間に . が必要。

iex(21)> is_function(add)
true
iex(22)> add.(1, 3)
4

(連結した)リスト

リストは [] で囲む。リストにはどんな型でも含めることができる。

iex(23)> [1, 2, 3]
[1, 2, 3]
iex(24)> [1, "hello", :world]
[1, "hello", :world]

++ で連結、– で差を得ることができる。

iex(25)> [1, 2, 3] ++ [4, 5, 6]
[1, 2, 3, 4, 5, 6]
iex(26)> [1, 2, 1, 3] -- [1, 3]
[2, 1]

差といっても、全部が引かれるわけではないんだな。これはちょっとハマりどころかも。
hdtl は Scheme でいう carcdr

iex(27)> hd([1, 2, 3])
1
iex(28)> tl([1, 2, 3])
[2, 3]

タプル

タプルは { と } で囲む。

iex(29)> {:ok, "hello"}
{:ok, "hello"}
iex(30)> tuple_size({:ok, "hello"})
2

関数 put_elem/3 を使うと、タプルのインデックスに新しい値を割り当てることができる。

iex(31)> tuple = {:ok, "hello"}
{:ok, "hello"}
iex(32)> put_elem(tuple, 1, "world")
{:ok, "world"}
iex(33)> tuple
{:ok, "hello"}

put_elem/3 は新しい値を返すことに注意。Elixir の値は変更不可なので、上のように変数 tuple の値は変わらない。

補足

関数の名前を書くのに foo/1 のような書き方をする。これは関数 foo が引数を1つとることを表している。Elixir では引数の数の異なる、同名の関数を定義できるらしい。