Elixir for Windows

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

# なぜ Elixir？

- 動的型付け関数型言語

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

# ドキュメント

- [Elixir School 日本語訳](https://elixirschool.com/ja/ "Elixir School 日本語訳") : Elixir をざっくり掴める
- [Elixir Documentation](https://elixir-lang.org/docs.html "Elixir Documentation") : モジュールを調べる
- [Learn You Some Erlang for Great Good! 日本語訳](https://www.ymotongpoo.com/works/lyse-ja/ "Learn You Some Erlang for Great Good! 日本語訳") : 結局 Erlang/OTP を知らないと色々悩む
- [Erlang Documentation](http://www.erlang.org/docs "Erlang Documentation") : 直接ここを辿るより Erlang のモジュール名からググった方が早いかも

# インストール

[Elixir 公式](https://elixir-lang.org/ "Elixir 公式")より、[elixir-websetup.exe](https://repo.hex.pm/elixir-websetup.exe "elixir-websetup.exe") をダウンロード。
[Erlang](http://www.erlang.org/ "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()
```

## 入力キャンセル

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

```elixir: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
```

そこで、[ansicon](https://github.com/adoxa/ansicon "ansicon")、[ConEmu](https://conemu.github.io/ "ConEmu") などを利用しているなら、

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

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

# 文字コード

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

# Hello, World!

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

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

## elixir.bat

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

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

パイプ演算子がある。

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

改行して書ける。

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

```:cmd.exe
> elixir hello.exs
Hello, World!
```

# モジュールと関数

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

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

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

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

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

読み辛いので、

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

と書いたりもする。

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

## コンパイル

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

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

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

### elixirc.bat

```:cmd.exe
> elixirc sample.ex
```

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

## モジュールを使う

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

```elixir:example.exs
Sample.add(1, 2)
|> IO.puts()
```

```:cmd.exe
> elixir example.exs
3
```

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

# コマンドライン引数

```elixir:argv.exs
System.argv()
|> IO.inspect()  # 検査用文字列を出力
```

```cmd.exe
> elixir argv.exs a b c
["a", "b", "c"]
```

# Mix

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