v1.1.0¶
https://github.com/elixir-lang/elixir/releases/tag/v1.1.0
概要¶
強化¶
- Erlang 17, 18 の双方をサポート
- v1.2では Erlang 18 のみのサポートとなる予定
Enum
,Dict
,Task
モジュールに新規関数を追加MapSet
データ型を追加
廃止¶
Accessプロトコルにおけるopts[key]形式の文法¶
Access
プロトコルはopts[key]
形式の文法をサポートしなくなる。opts[key]
形式の文法はDict
モジュールのサブセットとなる。- そのため、このように
Access
プロトコルを実装しようとすると警告が出る。 Access
モジュールやopts[key]
形式が廃止となるわけではない。
ツール¶
- ExUnit の利用においてテストをスキップできるようになった。
- Mix で警告やエラーメッセージを強化。
- Mix のコンパイル速度を高速化。
mix profile.fprof
タスクを追加。- Hex と Rebar でチェックサムを正しく取得できるようにするため、
local.public_keys
を設定。
その他¶
CODE_OF_CONDUCT.md
をリポジトリに追加。
強化¶
Elixir¶
Application¶
Application.fetch_env!/2
を追加Application.loaded_applications/0
を追加Application.started_applications/0
を追加
CLI¶
- Windowsのbashライクなシェルで
--werl
をサポート
Dict¶
Dict.get_and_update/3
を追加。廃止されたAccessプロトコルに似た振る舞いをする。Dict.get_lazy/3
を追加Dict.pop_lazy/3
を追加Dict.put_new_lazy/3
を追加
Enum¶
Enum.random/1
を追加Enum.take_random/2
を追加Enum.min_max/1
を追加Enum.min_max_by/2
を追加Enum.reverse_slice/3
を追加Enum.reduce_while/3
を追加Enum.dedup/1
を追加Enum.dedup_by/2
を追加- パフォーマンス追求のため
Enum
の各関数にインラインで共通的な map の使い方ができるようにした
File¶
File.lstat/1
を追加。File.stat/1
のような働きをするが、シンボリックリンクの情報を返すことができる。File.rename/2
を追加
Integer¶
Integer.digits/2
を追加Integer.undigits/2
を追加
Inspect¶
inspect/2
に:safe
オプションを追加。デフォルトで有効。
IO¶
IO.ANSI.Docs
で括弧書きのコードブロックをサポート
GenServer¶
GenServer.whereis/1
を追加。任意のpidにGenServer
のディスパッチを展開する。
Kernel¶
- 依存関係のため
:crypto
と:syntax_tools
を内包しないようにする。前者は暗号化されたデバッグ情報のためだけに必要で、後者は利用されていない。 var.Alias
文法が使用され、かつ、それがコンパイル時にatomに展開されなかった場合に、raiseする。(以前は警告)- 関数シグネチャのための引数名を新世代のものに
::/2
を特別なフォームとした- アンダースコア付きの変数が使用された場合に警告する
- バイナリ、8進数、16進数のリテラルでアンダースコアを許容する
- コード内でモジュール・アトリビュート、変数、文字列、数値が使用された場合に、警告する。但し、この表現には何の効果も無い。
- Unicodeのコードポイントにマップするため、文字列と文字リストにおいて
\uXXXX
と\u{X*}
をサポートする。
List¶
List.keytake/3
を追加
Module¶
- ドキュメントのメタデータ内で関数シグネチャのための名前推定を向上
Process¶
Process.info/2
でスペースのリストを許容
Set¶
MapSet
データ型を導入
Stream¶
Stream.dedup/1
を追加Stream.dedup_by/2
を追加Stream.transform/4
を追加
String¶
String.jaro_distance/2
により、名前などの文字列間でジャロ・ウィンクラー距離を計算することができる。Mixにおいてタスクが存在しない場合に “Did you mean?” と表示する機能に使われている。String.splitter/3
を追加。文字列をストリームとして分割。
StringIO¶
- StringIOデバイスの出力をフラッシュするために
StringIO.glush/1
を追加
Task¶
- タスクが実行中であるかをチェックし、そうでなければシャットダウンするための、
Task.yield/2
とTask.shutdown/2
を導入
Tuple¶
Tuple.append/2
を追加
URI¶
- “ws” 及び “wss” スキーマに対してデフォルトのポートを追加
URI.to_string/1
を追加
EEx¶
- スペース及び改行が前後する場合のみ、
<%
と%>
を自動的にトリムするため、:trim
を追加。
ExUnit¶
ExUnit
の出力にスキップされたテストの数を追加- データ構造をinspectするとき、またはエラーメッセージを取得するとき、ExUnitが全面的にダウンし失敗するバグを修正
assert/refute
で評価されたコードの意味を変更しないようにした。例えば、今回から、assert nil = some_expr()
は、表現としては評価の結果falseな値になるものだが、今回は想定通り例外を上げる。- doctest の失敗に対して、正しい行番号をレポートする。
Logger¶
Logger.log/3
にメタデータを含めた。メタデータ無しで動作させたい場合は、実行時に限り、Logger.bare_log/3
を使うこと。
Mix¶
- Elixirのバージョンが正しいことを、インストールをアーカイブ化した後にチェックし、ミスマッチがあった場合にフィードバックを行う。
mix.exs
でのrebarの依存ライブラリが、Mix でコンパイルされることを可能とした。:path
を介して rebar の依存関係を指定することが可能となったMix.Project.config_files/0
でconfig
ディレクトリのサブディレクトリも扱えるようになった- Agent にコンフィグを保管することにより、Mixプロジェクトで動的コンフィギュレーションが可能となった
rebar.config
ファイル内で、rebar3スタイルのGit参照が可能となった- Mixプロジェクトのコンパイル時の依存関係については、再コンパイルするのみとした。Elixirプロジェクトにおいて、再コンパイルが高速化される見込みである。
- 利用できないアプリケーションを設定しようとしたときに警告する
- コードプロファイリングを容易にするため、
mix profile.fprof
を追加 :only
の定義と競合する依存関係がある場合にアボートする- Elixir 又は SCM が変更された場合に、プロジェクトを全体的に再コンパイルする
--sha512
オプションを通すと、アーカイブインストール時にチェックサムを取ることができる- Hex と Rebar の依存関係のインストールを安全に管理するため、
mix local.public_keys
を追加
バグフィックス¶
Elixir¶
CLI¶
- コマンドを実行する際にロガーのメッセージが消去されていることを確認
Code¶
:delegate_locals_to
が多くのシチュエーションで選択されたモジュールにデリゲートするのに失敗し、大量のスタックトレースを出力していた。そのため、このオプションはimportによって置き換えられた。
Exception¶
- 例外メッセージを計算している最中、たとえそのメッセージが不正なものであっても、失敗しないようにした。
File¶
File.touch/2
とFile.stat/2
がUTCを入出力できるようにした。
Float¶
Float.parse/1
で完全な科学的記数法をサポート
Kernel¶
- モジュール本体では
in/2
引数を展開しないようにした - 未定義の atom/alias シンタックス
:foo.Bar
に対してシンタックスエラーを投げるようにした - ターゲットのディレクトリに書き込み可能でないためにコンパイルができない場合のエラーメッセージを強化
&and/2
や¬/1
その他のような記号でなはない演算子を捕捉できるようにした- ヒアドキュメントの終端が、エスケープされることなく行の中盤で偶然見つかった場合、例外を上げる
- 何もインポートされなかった場合、インポート失敗を警告しないようにした。
- キャプチャー演算子に255を超える数の引数が渡された場合に、例外を上げる。
Macro¶
Macro.to_string/1
でキャプチャーを正しくコンバートするようにした
Module¶
Module.split/1
内において、Elixirでないモジュール名を許容しないようにした