Elixir基礎

■概要

ElixirはErlang(アーラン)の仮想マシン(BEAM)上で動作するプログラム言語です。
Earlangの特性である「分散システム」「障害体制」「リアルタイムシステム」等を使用することができます。

■Elixirソースファイル

Elixirのソースファイルは「.ex」「.exs」拡張子の2種類があります。
※exとexsでプログラムの内容が変わるということはありません。

●ex
	拡張子exはコンパイルすることを前提として作成するファイルです。
	実行するためにモジュールと関数が必要になります。

	・実行までの流れ
		①.exファイルを作成する
			最初はコンパイルするためのexファイルを作成します。

		②.コードを書く
			exファイルを作成したら中に実行するためのコードを書きます。

			・例
				defmodule First do
				  def hello do
				    IO.puts "Hello World"
				  end
				end

		③.コンパイルする
			「elixirc」コマンドを使用してコンパイルします。

			・例
				elixirc ファイル名.ex

			・注意点
				ディレクトリの中にファイルがなければエラーになるので、
				ディレクトリの場所に注意して下さい。

		④.実行する
			コンパイルが成功したら「*.beam」ファイルが作成されますので、
			このファイルを使用して実行します。
			実行は「elixir -e モジュール名.関数名」で行います。

			・例
				elixir -e First.hello

			きちんと動作したらHello Worldと出力されます。

●exs
	exsはスクリプトファイルとしてコーディングすることを前提としたファイルで、
	コンパイルせずとも実行が可能です。

	・実行までの流れ
		①.ファイル作成
			exsファイルを作成します。

		②.コーディング
			作成したファイルにコーディングします。

			・例
				IO.puts "Hello Elixir World"

		③.実行
			コーディングが完了したら「elixir ファイル名」で実行します。
			きちんと動作したらHello Elixir Worldと出力されます。

■コメント

コメントとはプログラムソース内に記述するメモのことです。
プログラムの内容に対してきちんとコメントを残しておくことで、
プログラムの保守性が上昇します。

●書式
	Elixirのコメントは「#」を使用します。
	#を使用した場所から行末までのコードが無視されます。

	・例
		#コメントテスト
		str = "HelloWorld"

	・注意点
		コメントはElixirのソース上では認識しますが、
		対話モード(コマンドプロンプトを使用したiex)では動作しません。

●メリット
	コメントを使用するメリットは保守性が向上することです。
	例えばプロジェクト内で別の人が担当していた箇所を引き継ぐことになったとします。
	この時コメントが一切ない場合、0からソースを読み取っていかなればいけません。
	ですが、コメントがきちんと書かれているソースの場合、
	0からではなくコメントを見ながら処理を把握できるので
	作業効率が上昇し、正確に引継ぎできる可能性が高まります。

■基本データ型

以下はElixirで使用する基本的なデータ型です。
紹介している型以外にもリストやタプルといったデータ型はありますが、
それらは別で説明します。

●整数
	整数は小数点を含まない値です。
	Elixirでは使用できる整数の値に制限はありません。

	・進数表記
		基本は10進数を使用しますが、2進数、8進数、16進数も使用可能です。

		・2進数
			2進数を使用する際は値の先頭に0bをつけます。

			・例
				iex> 0b1111
				15

		・8進数
			8進数を使用する際は値の戦闘に0oをつけます。

			・例
				iex> 0o7777
				4095

		・16進数
			16進数を使用する際は値の先頭に0xをつけます。

			・例
				iex> 0xffff
				65535

		・注意点
			2進数や8進数を使用する場合、各進数の桁を超える値を使用したら
			エラーになるので注意して下さい。

			・例
				iex> 0b1120
				** (SyntaxError) iex:7: syntax error before: "20"

	・桁区切り
		桁が多くなる場合は「_」を使用することで桁を区切り見やすくすることが可能です。
		3桁ごとなどの制限はなく、使用者の好きに設定できます。

		・例
			iex> 1000_000_00_0
			1000000000

●浮動少数
	浮動少数は64ビットの倍精度少数を設定することができ、
	指数eにも対応しています。

	・例
		iex>1.0000045
		1.0000045

	・指数例
		iex> 1.532-4
		1.532e-4

	・注意点
		浮動少数は必ず1桁以上の数値が必要です。
		仮に-1~1の値だったとして必ず0を書く必要があります。

		・例
			iex> 0.14
			0.14

		・エラー例
			iex> .14
			** (SyntaxError) iex:13: syntax error before: '.'

●文字列
	文字列はElixirではUTF-8でエンコードされており、使用する文字列の先頭と末尾を
	「"」を使用して囲みます。

	・例
		iex> "Hello Elixir World"
		"Hello Elixir World"

	・エスケープシーケンス
		エスケープシーケンス(改行やタブなど)は有効ですが
		文字列として出力する関数を使用する必要があります。

		・例
			iex> IO.puts "Test\nTest2"
			Test
			Test2

			※IO.putsは文字列を出力する関数です。
			
	・文字連結
		文字連結は「<>」を使用します。

		・例
			iex> str1 = "ABCD"
			"ABCD"
			iex> str2 = "EFGH"
			"EFGH"
			iex> str1 <> str2
			"ABCDEFGH"

	・値の埋め込み
		Elixirでは文字列の中に「#{変数名}」を記述することで、
		変数の値を埋め込むことができます。
		埋め込むことができる値は整数、浮動少数、文字列、アトムなどが可能です。


		・例
			iex> val = 1000
			1000
			iex> str = "val = #{val}"
			val = 1000

●真理値
	Elixirの真理値は「true」と「false」が用意されており、
	falseとnilは偽、それ以外の値は全て真(true)と判断されます。

●アトム
	アトムは名前がそのまま値となる定数です。
	名前の前に「:」をつけることでアトムとして扱われます。

	・例
		iex> :Test == :Test
		true
		iex> :Test == :Test2
		false

	・真理値との関係
		真理値のtrueとfalseの正体はアトムです。

		・証明コード
			iex> true === :true
			true

	・使用できる文字
		アトムに使用できる文字は英字の大文字、小文字、数字、アンダースコア(_)、「@」が
		使用でき、終端文字としてのみ「!」や「?」が使えます。

		・先頭で使える文字
			先頭で使用できる文字は英字とアンダースコア(_)のみです。
			「@」や数字は使えないので注意して下さい。

		・例1
			iex> :yttm@gmail
			:yttm@gmail

		・例2
			iex> :ElixirWolrd!
			:ElixirWolrd!

■演算子

こちらで紹介する演算子は「算術演算子」「比較演算子」「論理演算子」です。
他にも「マッチ演算子」などがありますが、それらは別で説明します。

●算術演算子
	算術演算子は計算を行うための演算子です。
	四則演算を行うための演算子が用意されています。

	・足し算
		足し算を行う場合は「+」演算子を使用します。
		この演算子を二つの値の間に指定すると左辺と右辺の値で足し算が行われます。

		・例
			iex> 1 + 2
			3
			iex> x = 10
			10
			iex> x + 1
			11

	・引き算
		引き算を行う場合は「-」演算子を使用します。
		この演算子を二つの値の間に指定すると左辺と右辺の値で引き算が行われます。

		・例
			iex> 1 - 2
			-1
			iex> x = 10
			10
			iex> x - 1
			9

	・掛け算
		掛け算を行う場合は「*」演算子を使用します。
		この演算子を二つの値の間に指定すると左辺と右辺の値で掛け算が行われます。

		・例
			iex> 5 * 2
			10
			iex> x = 10
			10
			iex> x * 4
			40

	・割り算
		割り算を行う場合は「/」演算子を使用します。
		この演算子を二つの値の間に指定すると左辺と右辺の値で割り算が行われます。

		・例
			iex> 5 / 2
			2.5
			iex> x = 10
			10
			iex> x / 3
			3.3333333333333335

		・強制浮動少数
			Elixirの「/」を使用した割り算は整数同士でも強制的に
			浮動少数として扱われます。

			・例
				iex> 10 / 2
				5.0

			浮動少数ではなく整数としての結果がほしい場合はdiv関数を使用します。

			・例
				iex> div(10, 5)
				2
				iex> div(10, 4)
				2

	・余り算
		割り算の余りを求める余り算を行う場合は「rem」関数を使用します。
		
		・例
			iex> rem(10, 4)
			2
			iex> rem(10, 3)
			1
			iex> rem(4, 2)
			0

●比較演算子
	比較演算子は二つの値を比較する際に使用する演算子です。
	比較の結果が正しければ「true」間違っていれば「false」となります。

	・==
		「==」は左辺と右辺の値が同じ値かを比較する演算子です。
		同じ値なら「true」異なった値なら「false」となります。

		・例
			iex> 1 == 1
			true
			iex> 1 == 2
			false
			iex> x = 10
			10
			iex> y = 10
			10
			iex> x == y
			true

	・!=
		「!=」は左辺と右辺の値が異なっているかを比較する演算子です。
		値が異なっていたら「true」同じなら「false」となります。

		・例
			iex> 1 != 1
			false
			iex> 1 != 2
			true
			iex> str = "Hello"
			"Hello"
			iex> str2 = "Hello Wolrd"
			"Hello Wolrd"
			iex> str != str2
			true
	・===
		「===」はデータ型の違い含めるなど「==」よりも厳密な等号比較が行われます。
		値が同じ値なら「true」異なる値なら「false」となります。

		・例
			iex> 20.0 == 20
			true
			iex> 20.0 === 20
			false

		上の例では1回目の比較は「==」を使用し、20.0と20を比較し、結果はtrueとなっています。
		2回目の比較では「===」を使用し再度20.0と20を比較していますが、
		結果はfalseとなっています。
		これは20.0は浮動少数型、20は整数型なので厳密に比較すると異なっていると
		判断されたためです。

	・!==
		「!==」は「!=」よりも厳密な判定が行われます。
		型などを含めて値が異なっていたら「true」、完全に値が一致していたら「false」となります。

		・例
			iex> 20.0 != 20
			false
			iex> 20.0 !== 20
			true

	・<=
		「<=」は2つ値の大小関係を比較します。
		左辺の値が右辺の値以下の場合「true」左辺の値が右辺の値よりも
		大きければ「false」となります。

		・例
			iex> 20 <= 30
			true
			iex> 20 <= 20
			true
			iex> 20 <= 10
			false

	・<
		「<=」は2つ値の大小関係を比較します。
		左辺の値が右辺の値よりも小さい場合「true」
		左辺の値が右辺の値以上なら「false」となります。

		・例
			iex> 20 < 30
			true
			iex> 20 < 20
			false
			iex> 20 < 10
			false

	・>=
		「>=」は2つ値の大小関係を比較します。
		左辺の値が右辺の値以上の場合「true」左辺の値が右辺の値よりも
		小さければ「false」となります。

		・例
			iex> 30 >= 20
			true
			iex> 30 >= 30
			true
			iex> 20 >= 30
			false

	・>
		「>」は2つ値の大小関係を比較します。
		左辺の値が右辺の値よりも大きい場合「true」
		左辺の値が右辺の値以下なら「false」となります。

		・例
			iex> 30 > 20
			true
			iex> 30 > 30
			false
			iex> 20 > 30
			false

	・文字の比較
		文字列は大文字、小文字を区別して判定します。

		・例
			iex> "ABC" == "ABC"
			true
			iex> "ABC" == "abc"
			false

		上の例で、最初の比較はどちらも「"ABC"」で比較しており、結果はtrueになっています。
		次の比較は右辺が「"ABC"」左辺が「"abc"」で比較しており、結果はfalseです。
		2回目の比較は左辺が全て大文字、右辺が全て小文字なので、別の文字列として扱われ、
		比較の結果としてfalseとなっています。

●論理演算子
	論理演算子は複雑な条件式を行う場合に使用される演算子で、主に式と式の繋ぎとして使用されます。

	・論理和
		論理和は二つの条件式の結果のどちらかがtrueだった場合、
		全体の条件式の結果をtrueとして判定する演算子です。
		「||」記号を使用します。
		
		・例
			iex> "ABC" == "ABC" || 20 == 30
			true
			iex> "ABC" == "abc" || 20 == 30
			false

	・論理積
		論理積は二つの条件式の結果が両方ともtrueだった場合、
		全体の条件式の結果をtrueとして判定する演算子です。
		「&&」記号を使用します。

		・例
			iex> "ABC" == "ABC" && 20 == 20
			true
			iex> "ABC" == "ABC" && 20 == 30
			false
			iex> "ABC" == "def" && 10 > 100
			false

	・否定
		否定は条件式の結果を反転させます。
		条件式の結果がtrueだったらfalse、falseだったらtrueとなります。
		否定は論理積、論理和と異なり否定したい条件式の前に「!」を設定します。
		※否定を行う条件式は()で囲んでください。

		・例
			iex> !("ABC" == "ABC")
			false
			iex> !("ABC" == "DEF")
			true