基本的なデータ型
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
真理値
true と false が真理値。
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 が返ってくる。fn ~ end で作った関数を呼び出すには、関数名と引数リストの間に . が必要。
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]
差といっても、全部が引かれるわけではないんだな。これはちょっとハマりどころかも。
hd と tl は Scheme でいう car と cdr。
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 では引数の数の異なる、同名の関数を定義できるらしい。
