Skip to content

Instantly share code, notes, and snippets.

@jakejscott
Last active December 23, 2015 10:29
Show Gist options
  • Save jakejscott/6621448 to your computer and use it in GitHub Desktop.
Save jakejscott/6621448 to your computer and use it in GitHub Desktop.
Playing around with Elixir macros
defmodule My do
defmacro if(condition, clauses) do
do_clause = Keyword.get(clauses, :do, nil)
else_clause = Keyword.get(clauses, :else, nil)
quote do
case unquote(condition) do
_ in [false, nil] -> unquote(else_clause)
_ -> unquote(do_clause)
end
end
end
defmacro unless(condition, clauses) do
quote do
if unquote(condition) do
unquote(Keyword.get(clauses, :else, nil))
else
unquote(Keyword.get(clauses, :do, nil))
end
unquote(Keyword.get(clauses, :finally, nil))
end
end
end
defmodule Test do
require My
My.if 1 == 2 do
IO.puts "1 == 2"
else
IO.puts "1 != 2"
end
My.unless 1 == 1,
do: IO.puts("I shouldn't be run"),
else: IO.puts("I should be run"),
finally: IO.puts("Lastly, I should always be run!")
My.unless 1 != 1,
do: IO.puts("Yes, me please"),
else: IO.puts("No, not me"),
finally: IO.puts("Thanks for the shoes")
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment