『プログラミング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