9
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Elixir for Windows

Last updated at Posted at 2018-06-06

忘れっぽい自分のために。

なぜ Elixir?

  • 動的型付け関数型言語

これをすぐに使える処理系を欲するならば Win では一択ではないか?
Scheme のいい処理系があれば嬉しいんだけど。
いや違う。Lisp は開発環境込み込みな話になるのが辛いんだ。
Lua は代替案だったけど、テーブル操作で疲れた。
SWI-Prolog で Erlang/Elixir の魂を知ったけど、
自分があまり論理的な人間では無いと思い知らされた。

ドキュメント

インストール

Elixir 公式より、elixir-websetup.exe をダウンロード。
Erlang がインストールされていない場合、
このセットアップ中に同時にインストールすることができる。

インストールされるコマンド群は、

  • iex.bat : シェル(REPL)
  • elixir.bat : インタプリタ
  • elixirc.bat : コンパイラ
  • mix.bat : プロジェクト管理

いずれもヘルプ・オプションは -h

IEx

GUI 版

スタートメニューの Elixir ショートカットを実行すると、
Erlang の GUI シェル(werl)を利用した REPL が起動する。
コマンドラインからは、

cmd.exe
> iex --werl

IEx ヘルパー

IEx
> h()

入力キャンセル

IEx
iex(1)> IO.puts(
...(1)> #iex:break
** (TokenMissingError) iex:1: incomplete expression

iex(1)>

終了

CUI 版

iex.bat はバッチファイルなので Ctrl+C
なんか気持ち悪い。

GUI 版

単に窓を閉じるか、Ctrl+G で、

IEx
>
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 のモジュール呼び出しで、

IEx
> :init.stop()
:ok

:init は Erlang のモジュール名。
コロン前置識別子は Erlang でのアトム。

.iex.exs

iex 起動時に読み込まれるスクリプト。
現ディレクトリに存在しなければ、ホームディレクトリを探しに行く。
ホームディレクトリは System.user_home/0 の返り値。

IEx.configure/1

iex のカスタマイズができる。

ANSI エスケープ・シーケンス

※ 以下の内容は GUI 版では機能しない。

例えば、IEx ヘルパーの clear/0 を実行すると、

IEx
> clear()
Cannot clear the screen because ANSI escape codes are not enabled on this shell

そこで、ansiconConEmu などを利用しているなら、

IEx
> Application.put_env(:elixir, :ansi_enabled, true)
:ok

これを .iex.exs に書いておけばよい。

文字コード

ソースも I/O も文字列も UTF-8。
したがって、CUI 版を利用すると CP932 で問題が起こる。

Hello, World!

IEx
> IO.puts("Hello, World!")
Hello, World!
:ok

関数呼び出しの括弧は省略できるので、IO.puts "Hello, World!" でもよい。
IO は Elixir のモジュール名。
このモジュール名は :"Elixir.IO" のシンタックスシュガー。

elixir.bat

慣習としてスクリプトの拡張子は exs

hello.exs
IO.puts("Hello, World!")

パイプ演算子がある。

hello.exs
"Hello, World!" |> IO.puts()

改行して書ける。

hello.exs
"Hello, World!"
|> IO.puts()
cmd.exe
> elixir hello.exs
Hello, World!

モジュールと関数

Erlang とは違い、
ひとつのファイル内に複数のモジュールを定義できる。
したがってファイル名はモジュール名に合わせなくてもよい。
また、モジュールは入れ子定義もできる。

Erlang 同様、関数はモジュールに属す。
慣習として、コンパイル目的のソースの拡張子は ex にする。

sample.ex
defmodule Sample do
  def add(x, y) do
    x + y
  end
end

do-end ブロックは、実はシンタックスシュガー。
というか Elixir には式しかない。
defmoduledef はマクロ。

sample.ex
defmodule(Sample, do: def(add(x, y), do: x + y))

読み辛いので、

sample.ex
defmodule Sample do
  def add(x, y), do: x + y
end

と書いたりもする。

defp で定義すればプライベートになる。

コンパイル

実行可能ファイル(exe)を吐くわけではない。
Erlang 仮想マシンに対するコンパイル。
Erlang ではこれを BEAM ファイルと呼ぶ。

IEx
> c "sample.ex"
[Sample]
> Sample.add(1, 2)
3

この場合、BEAM ファイルは生成されない。

elixirc.bat

cmd.exe
> elixirc sample.ex

現ディレクトリに Elixir.Sample.beam が生成される。

モジュールを使う

exs と beam が現ディレクトリに有るならば、

example.exs
Sample.add(1, 2)
|> IO.puts()
cmd.exe
> elixir example.exs
3

任意パスの beam を使う場合は、-pa -pz でパスを指定する。

コマンドライン引数

argv.exs
System.argv()
|> IO.inspect()  # 検査用文字列を出力
cmd.exe
> elixir argv.exs a b c
["a", "b", "c"]

Mix

プロジェクト管理ツール。
最近はなんでもかんでも、こんなツールがすぐに説明される。
入門記事などで長々説明されるとうんざりする。
日曜プログラマなら急いで覚える必要はない。
というか、日曜プログラマが Erlang/Elixir を使うのかしら。。。

9
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?