Elixir 1.7が重視するのは、日常作業の品質の向上だ – 作者のJosé Valim氏は、このように記している。その中には、スタックトレースを取得するための新たな__STACKTRACE__
構造、Erlangの新しい:logger
モジュールへの統合、ユニットテストライブラリExUnitの改良、ドキュメント内のメタデータのサポートなどが含まれる。
Elixir 1.7では例外システムが改善され、ArgumentError
、ArithmeticError
、KeyError
例外の生成によって、これまでよりも詳細な診断情報が提供されるようになった他、従来のSystem.stacktrace/0
に代えてスタックトレース取得に使用可能な__STACKTRACE__
構造が新たに追加された。
try do
... something that may fail ...
rescue
exception ->
log(exception, __STACKTRACE__)
reraise(exception, __STACKTRACE__)
end
__STACKTRACE__
は静的にスコープされている(lexically scoped)ので、System.stacktrace/0
のように副作用に依存していない。Valim氏によると、これによってtry
ブロックの終了後にスタックトレースを追跡する必要がなくなるため、将来のElixirリリースでのパフォーマンス向上が期待できる。
Elixir Loggerモジュールは、Erlang/OPT 21で利用可能なErlangの:logger
にプラグインされることで、次のように豊富なメタデータを完全に活用できるようになった。
-
:crash_reason
– throw/error/exitの理由コードを第1引数、スタックトレースを第2引数とする、2要素のタプル。throwは常に構造{:nocatch, term}
を持つが、errorは常にExceptionで、exitは他のケースをカバーする。 -
:initial_call
– プロセスを起動する最初のコール。 -
:registered_name
– atomとして登録されるプロセス名。
さらに、debug
やinfo
などのLogger
マクロは、そのメッセージが実際にログに記録されない限り評価されなくなった。また、新たに用意された:compile_time_purge_matching
オプションによる、コンパイル時のメタデータに基づくログエントリのフィルタリングが可能になった。例えば、アプリケーション:foo
の:info
より低いレベルのログ呼び出しと、Bar.foo/3
からのログ呼び出しを無視するには、Logger
を次のように設定する。
config :logger,
compile_time_purge_matching: [
[application: :foo, level_lower_than: :info],
[module: Bar, function: "foo/3"]
]
前述のように、ElixirのユニットテストライブラリであるExUnitも改善され、assert
マクロがより詳細な情報を提供するようになった。例えば、 assert some_function(expr1, var2)
文が失敗した場合、some_function
への引数値が出力されるので、テストを再実行して値を検査する必要がなくなる。
最後に、Elixir 1.7では、次の例のように、ドキュメントにメタデータを注釈することも可能になった。
@moduledoc "A brand new module"
@moduledoc authors: ["Jane", "Mary"], since: "1.4.0"
Elixir 1.7のExDoc
ツールでは、非推奨のモジュールや関数、コールバック、型の使用にフラグを立てたり、特定の機能がいつ導入されたかを示すために、これらのメタデータを活用することができる。
Elixir 1.7の変更点に関する詳細については、公式のリリースノートを必ず参照して頂きたい。
この記事を評価
- 編集者評
- 編集長アクション