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 では引数の数の異なる、同名の関数を定義できるらしい。