基本的なデータ型

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

Elixirにさわってみた

関数型言語の Elixir(エリクサー)にさわってみた。ネットの情報を見た感じだと、Ubuntu にインストールするのはちょっと面倒そうだったので、こないだ買った新しいノートPC(windows10)で。
Elixir は Erlang の VM 上で動作する言語。Erlang の特徴を引き継ぎつつ、Ruby 風の文法を持っているらしい。
ともかく↓このページの最初だけをやってみた。

 cf. 1 Introduction – はじめに – Elixir

インストール

↓このページから、Windows 用のインストーラをダウンロードしてインストールする。

 cf. Installing Elixir – Elixir

上のページからダウンロードできるのは Web インストーラで、実行中に Erlang と Elixir をダウンロードするので結構時間がかかるけど、基本的には指示に従うだけでインストールできた。

^o^ > elixir -v
Erlang/OTP 19 [erts-8.0] [64-bit] [smp:4:4] [async-threads:10]

Elixir 1.3.4

インタラクティブモード

iex コマンドで起動する。

^o^ > iex
Eshell V8.0  (abort with ^G)
Interactive Elixir (1.3.4) - press Ctrl+C to exit (type h() ENTER for help)
iex(1)> 40 + 2
42
iex(2)> "Hello" <> " world"
"Hello world"

<> は文字列連結の演算子。

スクリプトを動かす

elixir コマンドでスクリプトを実行することができる。スクリプトファイルの拡張子は exs。

IO.puts "Hello world
from Elixir"
^o^ > elixir hello.exs
Hello world
from Elixir

文字列の途中に自然に改行を入れられるのが新鮮。

今日はここまで。