20. ifの定義
defmacro if(condition, clauses) do
do_cl = K.get(clauses, :do)
else_cl = K.get(clauses, :else)
quote do
case unquote(condition) do
x when x in [false, nil] ->
unquote(else_cl)
_ ->
unquote(do_cl)
end
end
end ※ 一部略。KはKeywordのalias
21. defmacro if(condition, clauses) do
do_cl = K.get(clauses, :do)
else_cl = K.get(clauses, :else)
quote do
case unquote(condition) do
x when x in [false, nil] ->
unquote(else_cl)
_ ->
unquote(do_cl)
end
end
end
ifの定義
※ 一部略。KはKeywordのalias
clausesはASTでは?
22. defmacro if(condition, clauses) do
do_cl = K.get(clauses, :do)
else_cl = K.get(clauses, :else)
quote do
case unquote(condition) do
x when x in [false, nil] ->
unquote(else_cl)
_ ->
unquote(do_cl)
end
end
end
ifの定義
※ 一部略。KはKeywordのalias
リストと2要素タプルは
ASTになっても形を保つので
Keywordモジュールでイジれる
23. ifの定義
defmacro if(condition, clauses) do
do_cl = K.get(clauses, :do)
else_cl = K.get(clauses, :else)
quote do
case unquote(condition) do
x when x in [false, nil] ->
unquote(else_cl)
_ ->
unquote(do_cl)
end
end
end ※ 一部略。KはKeywordのalias
24. ifマクロ展開後
if(now == :morning,
do: “good morning”,
else: “hi”)
↓
case now == :morning do
x when x in [false, nil] ->
“hi”
_ ->
“good morning”
end
30. テストするよ
defmodule MakuroTest do
use ExUnit.Case
import ExUnit.CaptureIO
require Makuro
test “twice” do
output = capture_io fn ->
Makuro.twice do: IO.puts “age”
end
assert output == “agenagen”
end
end
34. 例えばこれが1行で
defmodule Makuro do
defmacro __using__(_) do
quote do
import Makuro
import Makuro.Yabai
import Makuro.Kakkoii
import Makuro.TotemoYoi
end
end
end
use Makuro
39. オレオレassert
defmacro tadashii(expr) do
{ope, _, [lhs, rhs]} = expr
quote do
left = Macro.to_string(unquote lhs)
right = Macro.to_string(unquote rhs)
IO.puts “ひだり: “ <> left
IO.puts “みぎ: “ <> right
if unquote(expr) do
IO.puts “こいつら #{unquote ope}”
else
IO.puts “こいつら #{unquote ope} じゃない”
end
end
end