先月ManningからElixir in Actionが出版されました。MEAPから積ん読だったのでそろそろ読み始めようと思います。最近はPhoenixというWebフレームワークも人気が出ています。Erlangがすっと入ってこなかったところと、Rubyで嫌いなところが、Elixirで書くとメインの開発言語として使えるのか楽しみです。Elixirはドキュメントサイトが充実していて読みやすいです。まずはGetting StartedからIntroductionが動く環境を用意します。
プロジェクト
適当なところにプロジェクトを作成してdocker-compose.ymlを用意します。
$ cd ~/elixir_apps |
Dockerイメージはtrenpixster/elixirを使います。リポジトリは明記されていませんがたぶんこちら、trenpixster/elixir-dockerfileです。
elixir: |
バージョンの確認
docker-compose.ymlに定義したbashサービスを実行してインストールしたパッケージのバージョンを確認します。
$ docker-compose run --rm bash |
Erlang OTPのバージョンは17.5です。
$ cat /usr/lib/erlang/releases/17/OTP_VERSION |
Elixirのバージョンは1.0.4です。
$ elixir -v |
erlはErlangのインタラクティブシェルです。バージョンは6.4です。
$ erl -version |
iEx
ElixirではiExという専用のインタラクティブシェルが使えます。docker-compose.ymlに定義したiexサービスを起動します。
$ docker-compose run --rm iex |
Ctrl+C
を押して、a、enterで終了します。
BREAK: (a)bort (c)ontinue (p)roc info (i)nfo (l)oaded |
文字列
Getting Startedにあるサンプルを実行してみます。
iex(1)> 40 + 2 |
<>
は文字列結合演算子なので、2つ目の"helo" <> "world"
は文字列の結合、またはバイナリの結合を表しています。Elixirの文字列にはダブルクォートで囲うバイナリのStringと、シングルクォートで囲うリストの文字リスト (Char list)があります。Binaries, strings and char listsの説明を読んでみます。
文字列 (String)
Elixirの文字列はUnicodeのコードポイントをUTF-8でエンコードしたバイト列です。コードポイントは整数値 (integer)です。リテラル表記はダブルクォートで囲みます。is_binary
でtrueが返るように、文字列はバイナリです。
iex(1)> string = "hello" |
あ
のUnicodeのコードポイントは16進数で3042
、10進数で12345
です。1バイトは10進数で0
から255
までしか表現できません。1バイトでは表現しきれないため3バイトを使います。文字列に?
を使うとUnicodeのコードポイントを出力できます。
iex(3)> ?あ |
また、Elixirではバイナリを<<>>
で表記します。バイナリは<<0,1>>
のようなバイト列です。<>
でバイナリを結合することができます。
iex(5)> <<0,1>> <> <<2,3>> |
文字列とヌルバイトの<<0>>
を<>
で結合すると、最初の文字列のバイナリ表記を出力できます。
iex(6)> "あ" <> <<0>> |
あ
のバイト列は<<227,129,139>>
になります。
iex(7)> <<227, 129, 130>> |
文字リスト (Char list)
文字をシングルクォートで囲うと文字のリストになります。
iex(1)> char_list = 'hello' |
文字リストはUnicodeのコードポイントで構成されるリストです。
iex(2)> 'あ' |
1バイトで表現できる文字の場合、文字リストを評価するとコードポイントでなく文字そのものが表示されます。
iex(4)> 'ab' |
Binaries, strings and char listsによると、文字リストはバイナリを引数に取れない古いErlangのライブラリで使われているようです。