読者です 読者をやめる 読者になる 読者になる

mmag

ハマったことメモなど

Elixirのガード式でマクロが使える

という驚きの情報を得た!!!1

ガード式では数種類の関数しか使えず、ユーザが定義した関数を使おうとするとエラーになるのは皆様ご存知かと思います。なので関数の代わりにマクロにすれば使えちゃうのか!?そんなことでユートピアが実現するのか!!??

と思ったら、そんなに世の中甘くなかった。

結局は使える関数の種類は増えず、マクロがガード内に展開されるというだけの話。

でも読みやすさの面では大きく変化しそうなので使っていきたいですね。 長いガード式を含む定義って、どこで改行していいかよくわかんないですし。

defmodule Hoge do
  defmacrop sorted(a, b, c, d) do
    quote do
      (unquote(a) <= unquote(b)) and (unquote(b) <= unquote(c)) and (unquote(c) <= unquote(d))
    end
  end

  def func(a, b, c, d) when sorted(a, b, c, d) do
    IO.puts "sorted!" # do something
  end
end

テーマはFB matteをベースにしてます。作者さんに感謝を込めて。