こんにちは!
フリーランスでアプリからサイト制作、時々大学生をしているキクチです!
最近寒くなってきまして、室内にいる時間が増えましたね!
コーディングがはかどる季節がやってきました。
さて、前回の記事 最近話題のElixirってどんなもの!?(1) で関数型言語について説明しました。
今回はやっと本題であるElixirの説明をしていきます。
ただElixirの説明と言っても全部を説明していては、ElixirはErlangのVM ware上で動いているのでErlangの説明から始めなければなりません。
そこで今回は概要と簡単に動かしてみてその素晴らしさをざっくりお伝えできればと思います。
動かしてみよう!
まずどんな言語も知ることはそれを動かすところから始まります!
ここからElixirをお持ちのパソコンの体内に取り入れてみましょう。
それぞれのOSを選択してインストールして解凍してみてください。
無事インストールできましたか?
そしたらターミナルを開いてみて下さい。(macなら右上の虫眼鏡マークをクリックしてターミナルと検索してみてね)
次はそこに
$ iex
と打ち込んでみてください。そしたら
Erlang/OTP 20 [erts-9.0.5] [source] [64-bit] [smp:8:8] [ds:8:8:10] [async-threads:10] [hipe] [kernel-poll:false] [dtrace] Interactive Elixir (1.5.1) - press Ctrl+C to exit (type h() ENTER for help)
とでてきましたでしょうか。
でてきたら無事成功です!もうあなたはElixirの扉を開きました。
そしたらついでに
> 3 + 4
> String.reverse "Hello, World"
などと試しに色々うちこんで遊んでみましょう!
またコマンドプロンプトからだけでなく、ファイルをコンパイルしたいという方は、
どこかにhello.exsなどのようなファイルを作ってそこに
IO.puts "Hello, World!"
と書いてそのディレクトリ上でelixir hello.exsとコマンドを実行してみましょう。
歴史
ElixirはErlangという言語が土台にあり、その上に築かれた言語です。
ErlangはもともとはEricssonが並行処理/分散処理を目的として1980年代電話交換機のために開発した言語でした。
それが1998年にオープンソース化されEricsson、Facebook、CouchDB、WhatsApp、楽天、ドワンゴなどに採用されました。
そしてErlangが昇華し、Elixirとなりました。
Elixirの導入事例はドリコム、Poratext(Why We Choose Elixir To Power Our SMS Infrastructure)などがあります。
特徴は「多目的」「耐障害性」「無停止稼働(ホットスワップ)」などがあります。
基礎
パターンマッチ
Elixirは他の言語でいう代入は代入ではありません。
一度ほえ?ってなってしまいますが、実例を見てみましょう。
a = 1 //true
1 = a //true
2 = a //false
お分かりいただけただろうか?
既にaに1をセットしているので2 = aは間違いなので、これはエラーになります。
これがパターンマッチです。
list = [1,2,3] //[1,2,3]
[a,b,c] = list //[1,2,3]
a //1
b //2
c //3
左辺と右辺の値を同じにする方法を探すのがパターンマッチです。
ちなみに _ (アンダースコア)で値を無視することもできます。
[1,_,_] = [1,2,3] //[1,2,3]
型
Elixirでは5つの値型、2つのシステム型、4つのコレクション型があります。
値型の種類は整数型(integer)、浮動小数点(floating-point number, float)、アトム(atom)、範囲(range)、正規表現(regular-expression)
整数型、浮動小数点は他の言語と同じです。
アトムとはある何かの名前を表現する定数です。コロン(:)から始まる単語かElixirの演算子がアトムになります。
:fred :is_binary? :var@2 :<> :=== :"func/3" :"long john silver"
などなどがアトムになります。
範囲は
start...end
と書きます。
正規表現もまた他の言語と一緒です。
Regex.scan ~r{[aueio], "caterpillar" //["a"], ["e"],["i"],["a"]
システム型はPIDとポートというものがあります。
PIDはローカル、リモートへのプロセスへの参照でselfを呼び出して カレントプロセスを呼び出すことができます。
ポートは読み書きするリソースへの参照です。
コレクション型は
タプル、リスト、マップ、バイナリがあります。
タプルはPythonのタプルと違い順序をもったタプルでありコンマ区切りにしたデータ構造です。
{1, 2} {:ok, 42, "next"} {:error, :enonet}
リストはさきほどの書いたような連結データ構造です。
[1,2,3] ++ [4,5,6] //[1,2,3,4,5,6]
マップは辞書型のようなものでキーと値のペアのコレクションです。
states = %{ "AL" => "Alibama", "WI" => "Eisconsin"}
のように書きます。
バイナリは一般的にはあまり使わないですがビットやバイトのデータにアクセスしようとしたときに使います。
bin = << 1, 2 >> //<< 1, 2 >> byte_size bin // 2
関数
Elixirは無名関数・高階関数・クロージャ。関数リテラルなど関数に関して可能な用途も幅広いです。
また関数を関数として返したり、関数を引数にもってくることもできます。
今回はその中でも無名関数について扱いましょう。
fn parameter-list -> body parameter-list -> body .... end
このようにfn…endで囲むのが無名関数の書き方です。
次の例では関数を変数sumに束縛しています。
sum = fn (a, b) -> a + b end
また関数はこのように関数名に.(ドット)を付けて呼び出せます。
greet = fn -> IO.puts "Hello" end greet.() //Hello :ok
また関数にさきほどのパターンマッチをあてはめることもできます。
swap = fn {a, b} -> {b, a} end swap.( {6, 8} ) // {8, 6}
また関数を関数で返す方法はこのようになります。
fun1 = fn -> fn -> "Hello" end end fun1.() fun1.().() //"Hello"
このように関数に関しての自由度も高いです。
ぜひぜひもっと詳しく深掘っていってみて下さい!
今回はElixirのパターンマッチ・型・ 関数について扱いました。
今回の1記事だけではとても情報量が限られてしまいましたので、次回にて大事な再帰も含めたElixirの情報をもっとお伝えしていきます!
この記事がどれだけ需要があるかわかりませんが、もう続けるしかないのでどんどんElixirの情報を発信していきます!笑
まさか自分もこんな長編になるとは思いませんでしたっ!
それでは次回最近話題のElixirってどんなもの!?(3)乞うご期待!!
(この記事について修正点・誤った認識などありましたらコメントよろしくお願いします。)