プログラミングElixir読書メモ 第5章
第5章 無名関数
プログラミングElixir読書メモ 第4章
第4章 Elixirの基礎
Elixirの組み込みの型
値型
-
任意の大きさの整数型(integer)
-
浮動小数点数(floating-point nmber, float)
-
アトム(atom)
-
範囲(range)
-
正規表現(regular-expression)
システム型
-
PIDとポート(port)
-
リファレンス(reference)
コレクション型
- タプル(tuple)
- リスト(list)
- マップ(map)
- バイナリ(binary)
整数
10進法、16進法、8進法、2進法で書くことができる。
10進数はアンダースコア(_)を含むことができる。3桁で区切って可読性を上げたりできる。
整数には決まった最大値はない。その数に合った内部表現が使われる。
浮動小数点数
精度はIEEE754の倍精度。
アトム
ある何かのなまえを表現する定数で、コロン(:)から始める。
Rubyのシンボル的な感じかな。
範囲
start..endと書いて表す。
正規表現
~r{regexp} や ~r{regexp}opts のように書いて表す。
PIDとポート
PIDはローカル、あるいはリモートのプロセスへの参照。
ポートは読み書きするリソースへの参照。
リファレンス
make_ref関数で生成する。グローバルで一意。
タプル
順序を持ったコレクション。
波括弧{}で要素を囲う。
2〜4個の要素をもつが、それ以上になる場合はマップか構造体を使ったらいいらしい。
リスト
連結データ構造。で要素を囲う。
キーワードリスト
[name: "Dave", city: "Dallas", likes: "Programming"]
↓
[{:name, "Dave"}, {:city, "Dallas"}, {:likes, "Programming"}]
関数呼び出しの最後がキーワードリストなら、を省略できる。
マップ
キーとバリューのコレクション。
%{key => value, key => value}
キーはタプルやアトムでも良い。マップ内でキーの型はバラバラでもいい。
バイナリ
<<と>>で囲う
演算子
「a === b」とかできる。動的言語だ。
プログラミングElixir読書メモ 第3章
第3章 不変性
関数プログラミングでは、データは一度作られたら変更されない。
Elixirでも同様。
不変性の概要
Elixirでは[1, 2, 3]というリストを一度参照したら、もう一度変数を束縛し直すまで、いつも同じ値のリストを参照する。
リストの各要素に100を足したくなった場合は、新しい値を持つ、元のリストのコピーを生成する。
元のリストは変わらず残り、100を足すという動作は、元のリストへの参照を持った他のコードへ影響を与えない。
性能への影響
データを更新するごとにコピーを作っているので、非効率であることが想像される。
しかし実際は逆。
例えば、あるリストを元に新しいリストを生成するとき、下記のようなコードを書く。
list1 = [ 3, 2, 1 ]
list2 = [ 4 | list1 ] # [4, 3, 2, 1]となる
ほとんどの言語では、list2を構築するとき、4, 3, 2, 1が入っている新しいリストを作る。
Elixirでは、list1が変更されないことがわかっているので、先頭に4、末尾にlist1をもつリストを作るだけ。
ガーベージコレクション
Elixirでは、それぞれのプロセスが自分のヒープをもっている。
それぞれ個別のヒープは全てのデータをひとつのヒープで扱うよりずっとずっと小さいので、ガーベージコレクションが速く走る。ヒープがいっぱいになる前にプロセスが終了すれば、プロセスと共にヒープも破棄されるので、ガーベージコレクションは必要ない。
プログラミングElixir読書メモ 第2章
第2章 パターンマッチ
「あなたの考える代入は、私の考える代入ではない」
Elixirにおける等号はマッチ演算子であって、いわゆる「代入」じゃない。
左辺と右辺が同じものであるという「表明」のようなもの。
マッチ演算子(=)
マッチ演算子によってパターンマッチを行い、マッチすれば表明が成功し、
マッチしなければ表明できずエラーになる。
変数に値がセットされたら、そのパターンマッチ中では変更不可能。
次のパターンマッチでは変更OK。例としては以下の様な感じ。
a = 1 # OK
1 = a # OK
2 = a # エラー
a = 2 # OK
アンダースコア(_)
アンダースコア(_)はパターンマッチの中のワイルドカード。
変数として値を補足しなくていいなら、これを使うと良い。
[1, _, _] = [1, 2, 3] # OK
ピン演算子(^)
Elixirでは変数の束縛の期限が短くて、次のマッチのときには新しい値に束縛し直せる(Erlangではできないみたい)。
現在の変数の値でパターンマッチをしたい場合には、ピン演算子(^)を使う。
a = 1 # OK
a = 2 # OK
^a = 1 # エラー!
最初は、初回の変数の表明時にピン演算子を使って、変更不可にするのかと思ったけどそうではなかった。一度表明した変数に対してピン演算子を使って、以前の値を束縛する。
プログラミングElixir読書メモ 第1章
第1章 赤いカプセルをとれ
インストール方法
wget https://packages.erlang-solutions.com/erlang-solutions_1.0_all.deb && sudo dpkg -i erlang-solutions_1.0_all.deb sudo apt update sudo apt install esl-erlang elixir