忘れっぽい自分のために。
なぜ Elixir?
- 動的型付け関数型言語
これをすぐに使える処理系を欲するならば Win では一択ではないか?
Scheme のいい処理系があれば嬉しいんだけど。
いや違う。Lisp は開発環境込み込みな話になるのが辛いんだ。
Lua は代替案だったけど、テーブル操作で疲れた。
SWI-Prolog で Erlang/Elixir の魂を知ったけど、
自分があまり論理的な人間では無いと思い知らされた。
ドキュメント
- Elixir School 日本語訳 : Elixir をざっくり掴める
- Elixir Documentation : モジュールを調べる
- Learn You Some Erlang for Great Good! 日本語訳 : 結局 Erlang/OTP を知らないと色々悩む
- Erlang Documentation : 直接ここを辿るより Erlang のモジュール名からググった方が早いかも
インストール
Elixir 公式より、elixir-websetup.exe をダウンロード。
Erlang がインストールされていない場合、
このセットアップ中に同時にインストールすることができる。
インストールされるコマンド群は、
- iex.bat : シェル(REPL)
- elixir.bat : インタプリタ
- elixirc.bat : コンパイラ
- mix.bat : プロジェクト管理
いずれもヘルプ・オプションは -h
。
IEx
GUI 版
スタートメニューの Elixir
ショートカットを実行すると、
Erlang の GUI シェル(werl)を利用した REPL が起動する。
コマンドラインからは、
> iex --werl
IEx ヘルパー
> h()
入力キャンセル
iex(1)> IO.puts(
...(1)> #iex:break
** (TokenMissingError) iex:1: incomplete expression
iex(1)>
終了
CUI 版
iex.bat はバッチファイルなので Ctrl+C
。
なんか気持ち悪い。
GUI 版
単に窓を閉じるか、Ctrl+G
で、
>
User switch command
--> h
c [nn] - connect to job
i [nn] - interrupt job
k [nn] - kill job
j - list all jobs
s [shell] - start local shell
r [node [shell]] - start remote shell
q - quit erlang
? | h - this message
--> q
共通
Erlang のモジュール呼び出しで、
> :init.stop()
:ok
:init
は Erlang のモジュール名。
コロン前置識別子は Erlang でのアトム。
.iex.exs
iex 起動時に読み込まれるスクリプト。
現ディレクトリに存在しなければ、ホームディレクトリを探しに行く。
ホームディレクトリは System.user_home/0
の返り値。
IEx.configure/1
iex のカスタマイズができる。
ANSI エスケープ・シーケンス
※ 以下の内容は GUI 版では機能しない。
例えば、IEx ヘルパーの clear/0
を実行すると、
> clear()
Cannot clear the screen because ANSI escape codes are not enabled on this shell
そこで、ansicon、ConEmu などを利用しているなら、
> Application.put_env(:elixir, :ansi_enabled, true)
:ok
これを .iex.exs
に書いておけばよい。
文字コード
ソースも I/O も文字列も UTF-8。
したがって、CUI 版を利用すると CP932 で問題が起こる。
Hello, World!
> IO.puts("Hello, World!")
Hello, World!
:ok
関数呼び出しの括弧は省略できるので、IO.puts "Hello, World!"
でもよい。
IO
は Elixir のモジュール名。
このモジュール名は :"Elixir.IO"
のシンタックスシュガー。
elixir.bat
慣習としてスクリプトの拡張子は exs
。
IO.puts("Hello, World!")
パイプ演算子がある。
"Hello, World!" |> IO.puts()
改行して書ける。
"Hello, World!"
|> IO.puts()
> elixir hello.exs
Hello, World!
モジュールと関数
Erlang とは違い、
ひとつのファイル内に複数のモジュールを定義できる。
したがってファイル名はモジュール名に合わせなくてもよい。
また、モジュールは入れ子定義もできる。
Erlang 同様、関数はモジュールに属す。
慣習として、コンパイル目的のソースの拡張子は ex
にする。
defmodule Sample do
def add(x, y) do
x + y
end
end
do-end ブロックは、実はシンタックスシュガー。
というか Elixir には式しかない。
defmodule
、 def
はマクロ。
defmodule(Sample, do: def(add(x, y), do: x + y))
読み辛いので、
defmodule Sample do
def add(x, y), do: x + y
end
と書いたりもする。
defp
で定義すればプライベートになる。
コンパイル
実行可能ファイル(exe)を吐くわけではない。
Erlang 仮想マシンに対するコンパイル。
Erlang ではこれを BEAM ファイルと呼ぶ。
> c "sample.ex"
[Sample]
> Sample.add(1, 2)
3
この場合、BEAM ファイルは生成されない。
elixirc.bat
> elixirc sample.ex
現ディレクトリに Elixir.Sample.beam
が生成される。
モジュールを使う
exs と beam が現ディレクトリに有るならば、
Sample.add(1, 2)
|> IO.puts()
> elixir example.exs
3
任意パスの beam を使う場合は、-pa
-pz
でパスを指定する。
コマンドライン引数
System.argv()
|> IO.inspect() # 検査用文字列を出力
> elixir argv.exs a b c
["a", "b", "c"]
Mix
プロジェクト管理ツール。
最近はなんでもかんでも、こんなツールがすぐに説明される。
入門記事などで長々説明されるとうんざりする。
日曜プログラマなら急いで覚える必要はない。
というか、日曜プログラマが Erlang/Elixir を使うのかしら。。。