『プログラミング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)
ifやcaseなどの中で外側のスコープにある変数への代入を行うことが非推奨化されました.
詳細: 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)
defguardとdefgaurdpを使うことで,パターンマッチのガード節に書くことのできる条件式を自分で定義することができます.ただし,ガード節に任意の式が使えるようになったわけではなく,あくまで特定の条件に対するエイリアスのようなものを定義できるだけなので注意が必要です.
詳細: Kernel – Elixir v1.7.0-dev
Supervisor.start_link/2 の引数 (since 1.5)
Supervisor.start_link/2が,Supervisor.Spec.spec()だけではなく,module()もしくは{module(), term()}の形の引数も受け取れるようになりました.
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が追加されました.同時並行数なども指定できて便利です.
時刻に関するデータ型などの追加 (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ライクに簡単にネストしたデータ構造の一部を取得したり書き換えたりできるようになりました.
ExUnitに独自のテストの種類を追加できるようになった (since 1.3)
ExTest.Case.register_testを直接呼ぶことで,testやdoctestのようなテストの種類を独自で定義できるようです.
詳細: ExUnit.Case – ExUnit v1.5.3
ExUnit.describe/2 (since 1.3)
ユニットテスト系のライブラリでよくあるdescribeがExUnitにも追加されました.使い方も想像通り.
詳細: 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)
behaviourのcallbackの具体的な実装であることを明示するための属性として,@implが使えるようになりました.
具体的な使い方としては,@impl trueもしくは@impl BehaviourNameで後続する関数定義がcallbackの実装であることを明示することができます.
詳細: elixir/CHANGELOG.md at v1.5 · elixir-lang/elixir
iex, mixの機能拡張
formatter (since 1.6)
mix formatでコードを整形してくれるようになりました.
mix xref (since 1.3)
mix xref MODEでモジュールの依存関係を解析したりしてくれるようになりました.
デバッグ関連の関数 (since 1.5)
break!/4, continue/0など,iex上でのデバッグに便利なヘルパー関数が追加されました.
applications: の省略 (since 1.4)
mix.exsのapplicationが返すapplications:のパラメータを省略できるようになりました.depsの依存関係から,必要なものを自動的に推論してくれるようです.
詳細: Application inference in Elixir 1.4 – sergiotapia
mix escript.install
escriptを直接インストールできるようになりました.~/.mix/escriptsにPATHを通せば,一瞬で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
参考
- elixir/CHANGELOG.md at v1.6 · elixir-lang/elixir
- elixir/CHANGELOG.md at v1.5 · elixir-lang/elixir
- elixir/CHANGELOG.md at v1.4 · elixir-lang/elixir
- elixir/CHANGELOG.md at v1.3 · elixir-lang/elixir