Patternの可搬性
#Elixir #Snippets
Elixirのパターンはコンパイル時に評価されるので、ランタイムまで保持される「patternのリスト」のようなものは残念ながら書けない(はず)。
code:iex
Erlang/OTP 20 erts-9.0 source 64-bit smp:4:4 ds:4:4:10 async-threads:10 hipe kernel-poll:false
Interactive Elixir (1.5.2) - press Ctrl+C to exit (type h() ENTER for help)
iex(1)> {:ok, _}, {_non_ok, 0} |> Enum.any?(&match?(&1, {:error, 0}))
** (CompileError) iex:1: unbound variable _
(stdlib) lists.erl:1354: :lists.mapfoldl/3
(stdlib) lists.erl:1355: :lists.mapfoldl/3
(elixir) expanding macro: Kernel.|>/2
iex(1)> {:ok, 1}, {:error, 0} |> Enum.any?(&match?({_, 0}, &1))
true
match?/2はmacroで、コンパイル時に第1引数をpattern match演算子(すなわち=)の左辺に展開するので上記の例だと2パターン目は成立する
が、1パターン目は=やcase文の->の左辺、あるいは関数headerの引数部分などのpattern表現が許されている部分以外にpattern用の記法が使われているのでエラーになる。