マクロの使いみち
- 関数に適していないコード片
- 問題のドメインにコードを寄せる
関数が使えるのならマクロは使うな!
Elixirのブロックはキーワードリスト
-
ブロック
myif <condition> do <evaluate if true> else <evaluate if false> end
-
キーワードリスト
myif <condition>, do: <evaluate if true>, else: <evaluate if false>
My.myif/2
を実行した結果
goh@goh% iex "macros/myif.exs"
Erlang/OTP 21 [erts-10.1.2] [source] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:1] [hipe] [dtrace]
Interactive Elixir (1.7.4) - press Ctrl+C to exit (type h() ENTER for help)
> My.myif 1 == 2, do: (IO.puts "1 == 2"), else: (IO.puts "1 != 2")
1 == 2
1 != 2
:ok
上記のような結果になるのは…
- Elixirは関数呼び出し時に全ての引数を評価する
IO.puts/1
は処理が成功すると:ok
を返す
do節 or else節の実行を遅延させる必要がある => マクロを使う