『プログラミングElixir』の日本語版はElixir 1.2を想定して書かれていますが,現在の最新版は1.6.0-rc.1となり,そこそこバージョンが上がってしまっています.

そこで,これらのバージョン間での違いを雑にまとめました.

なお,書いている人はElixir初心者なので,説明不足や表記の間違いなどあればコメントなりプルリクなりでご報告ください.

文法の変更

変数名とatomのUnicode対応 (since 1.5)

(引用符なしの)atomと変数名に,Unicodeが使えるようになりました.例えば

ほげ = :ふが

も1.5以降では有効な文になります.

詳細: elixir/CHANGELOG.md at v1.5 · elixir-lang/elixir

ネストしたブロック内での代入の非推奨化 (since 1.3)

ifcaseなどの中で外側のスコープにある変数への代入を行うことが非推奨化されました.

詳細: elixir/CHANGELOG.md at v1.3 · elixir-lang/elixir

モジュール/関数の追加や仕様変更

DynamicSupervisor (since 1.6)

Supervisorのstrategyの1つである:simple_one_for_oneがdeprecatedになり,代わりに同等の機能を果たすDynamicSupervisorが追加されました.

詳細: Elixir 1.6 で入る DynamicSupervisor について - Qiita

defguard, defguardp (since 1.6)

defguarddefgaurdpを使うことで,パターンマッチのガード節に書くことのできる条件式を自分で定義することができます.ただし,ガード節に任意の式が使えるようになったわけではなく,あくまで特定の条件に対するエイリアスのようなものを定義できるだけなので注意が必要です.

詳細: Kernel – Elixir v1.7.0-dev

Supervisor.start_link/2 の引数 (since 1.5)

Supervisor.start_link/2が,Supervisor.Spec.spec()だけではなく,module()もしくは{module(), term()}の形の引数も受け取れるようになりました.

詳細 Supervisor – Elixir v1.5.3

Registry (since 1.4)

Registryという単純な分散型KVSのようなものが追加されました.

詳細: Registry – Elixir v1.7.0-dev

Task.async_stream (since 1.4)

並行版mapであるTask.async_stream/3, Task.async_stream/5が追加されました.同時並行数なども指定できて便利です.

詳細: Task – Elixir v1.5.3

時刻に関するデータ型などの追加 (since 1.3)

時刻に関するモジュールとデータ型Calendar, Date, Time, NaiveDateTime, DateTimeと,時刻を扱うシジル~D, ~T, ~Nが追加されました.

詳細: elixir/CHANGELOG.md at v1.3 · elixir-lang/elixir

get_inとかで使えるアクセサの追加 (since 1.3)

Access.all/0などを使うことで,JQueryライクに簡単にネストしたデータ構造の一部を取得したり書き換えたりできるようになりました.

詳細: Access – Elixir v1.5.3

ExUnitに独自のテストの種類を追加できるようになった (since 1.3)

ExTest.Case.register_testを直接呼ぶことで,testやdoctestのようなテストの種類を独自で定義できるようです.

詳細: ExUnit.Case – ExUnit v1.5.3

ExUnit.describe/2 (since 1.3)

ユニットテスト系のライブラリでよくあるdescribeExUnitにも追加されました.使い方も想像通り.

詳細: ExUnit.Case – ExUnit v1.5.3

Named Setup (since 1.3)

ExUnit.setup/1, ExUnit.setup_all/1に,初期化時に実行してほしい関数の一覧をアトムで渡すことができるようになりました.

詳細: elixir/CHANGELOG.md at v1.3 · elixir-lang/elixir

属性の追加

@deprecated (since 1.6)

APIが非推奨であることを表す@deprecatedという属性が追加されました.

詳細: elixir/CHANGELOG.md at v1.6 · elixir-lang/elixir

@since (since 1.6)

モジュールのAPIが追加されたバージョンを表す@sinceという属性が追加されました.

詳細: elixir/CHANGELOG.md at v1.6 · elixir-lang/elixir

@impl (since 1.5)

behaviourcallbackの具体的な実装であることを明示するための属性として,@implが使えるようになりました.

具体的な使い方としては,@impl trueもしくは@impl BehaviourNameで後続する関数定義がcallbackの実装であることを明示することができます.

詳細: elixir/CHANGELOG.md at v1.5 · elixir-lang/elixir

iex, mixの機能拡張

formatter (since 1.6)

mix formatでコードを整形してくれるようになりました.

詳細: format – Mix v1.7.0-dev

mix xref (since 1.3)

mix xref MODEでモジュールの依存関係を解析したりしてくれるようになりました.

詳細: xref – Mix v1.7.0-dev

デバッグ関連の関数 (since 1.5)

break!/4, continue/0など,iex上でのデバッグに便利なヘルパー関数が追加されました.

詳細: IEx.Helpers – IEx v1.5.3

applications: の省略 (since 1.4)

mix.exsapplicationが返すapplications:のパラメータを省略できるようになりました.depsの依存関係から,必要なものを自動的に推論してくれるようです.

詳細: Application inference in Elixir 1.4 – sergiotapia

mix escript.install

escriptを直接インストールできるようになりました.~/.mix/escriptsPATHを通せば,一瞬でescriptを実行できるようになります.

詳細: escript.install – Mix v1.7.0-dev

Git, Hexから直接インストール

mix archive.install, mix escript.installで直接hex, git, githubからインストールすることができるようになりました.具体的には以下のようにコマンドを入力することで,これらを行うことができます.

$ mix archive.install git https://gitrepo.example.com/path/to/repo
$ mix archive.install github user/project
$ mix archive.install hex package_name

詳細: archive.install – Mix v1.5.3

mix app.tree, mix deps.tree

現在のプロジェクト内のアプリケーション一覧と,依存関係にあるプロジェクトも含めたアプリケーション一覧を取得するコマンドmix app.tree, mix deps.treeが追加されました.

詳細: elixir/CHANGELOG.md at v1.3 · elixir-lang/elixir

mix test –stale

mix test --staleを実行すると,最後にmix test --staleが実行された後に変更されたモジュールと,そのモジュールに依存するモジュールのみのテストが行われるようになります.

詳細: elixir/CHANGELOG.md at v1.3 · elixir-lang/elixir

参考