Powered by AppSignal & Oban Pro
Would you like to see your link here? Contact us

基本的な文法

2 Basic syntax.livemd

基本的な文法

基本的な値

Elixirは動的型付け言語だが、内部的には型が存在する。

基本的な型は以下。

  • Integer
  • Float
  • Boolean
  • String
  • List
  • Tuple
  • Atom
  • Anonymous function
  • Port
  • Reference
  • PID

数値

# integer
1
# 16進数
0x01
# float
1.0
# float
1.0e+3

boolean

# boolean
true
false

Atom

  • :から始まる名前付きの値で, 実体がErlangVM上でただ1つ
    • コンパイル時(コーディング時)に定まっている定数を表現するために使われることが多い
    • 実体がただ1つなので, 同じAtomをプログラム内の複数箇所で使っても値はコピーされず, 既存のAtomに対する参照のみが増える
  • 一度生成されたAtomはVMから消えない( Garbage Collect されない)
    • メモリを使い尽くすことにつながる恐れがあるので, 動的にAtomを生成すべきではない
    • コーディング時にAtomの使用をためらう必要はない
:atom
:atom == :atom
:atom != :another
# booleanのtrueやfalse、値がないことを示すnilも実際にはatomとして定義されています
true == true
nil == nil

文字列

  • ダブルクォーテーション"を使う場合 => 文字列
  • シングルクォーテーション'を使う場合 => 文字のリスト

基本的にはダブルクォーテーションを使うのでいい。

# string
"abcABCアイウ"

文字列の中で#{}を使うと、式を埋め込むことができる。

#{}の中身は評価されて文字列に変換される。

target = "Alice"
"Hello #{target}."
"Answer of everything is #{1 + 2 + 3 + 5 + 7 + 11 + 13}!"

List (linked list)

  • 値が0個以上あることを表現する
  • 要素数が動的に増減する場合に使用する
  • 要素の型の組み合わせは任意
  • 内部実装はlinked list
    • ランダムアクセスは低速で, インデックスを使ったアクセスは組み込まれていない
# list
[0, "a", true, [0, 1, 2]]
l = [0, 1, 2]

try do
  IO.inspect(l[0])
rescue
  ArgumentError -> IO.inspect("Access to an item by index is not supported")
end
# Enum というモジュールにインデックスで要素を取り出す関数 at が実装されている

Enum.at([0, 1, 2, 3], 2)

Tuple

  • 複数の値を組み合わせた値
  • 要素数はコンパイル時に確定。つまり動的な要素の追加や削除は不可能
  • 何らかの「意味のある値の組合せ」を表現するために使われる
    • floatの組で「座標」を表現する
    • :ok, :errorとの組で処理の「成功」または「失敗」を表す
  • 値の型の組合せは任意
# tuple
{0, 1, 2}
# 処理が成功したことと, 結果の組を表すデータ構造として
File.read("./resources/2/hello.txt")
# 処理が失敗したことを表すデータ構造として
File.read("./resources/not/found")

Map

  • keyとvalueの組
  • 他言語では辞書やオブジェクトと呼ばれる
  • key, valueともにどのような型でも用いることができる
  • keyの重複は不可能
    • 重複すると、1組のkey valueだけ残る
    • どの組が残るかは仕様上不定
m = %{"key" => "value", 0 => 1, :atom => :value}

IO.inspect(m["key"])
IO.inspect(m[0])
IO.inspect(m[:atom])

keyがatomだけのとき、省略記法が使える

%{a: 0, b: "b", c: :value} == %{:a => 0, :b => "b", :c => :value}
%{a: 0} != %{"a" => 0}
m = %{:a => 0, "b" => 1}

m.a == m[:a]
m["b"]
# m.b # => KeyError

特徴的な演算子

Basic operators - Elixir

  • 中置演算子
    • すでに出ている+*などの算術演算子
    • リストの連結演算子 ++
    • 文字列の連結演算子 <>
  • 中置演算子も実体は関数
    • ドキュメントでは+/2のように参照する
1 + 2
[1, 2, 3] ++ [4, 5, 6]
"Hello" <> " world!"