Skip to content

Instantly share code, notes, and snippets.

@itsgreggreg
Created October 5, 2015 17:42
Show Gist options
  • Save itsgreggreg/940d521a747c9ef97176 to your computer and use it in GitHub Desktop.
Save itsgreggreg/940d521a747c9ef97176 to your computer and use it in GitHub Desktop.
Elixir opposite day
defmodule OppositeDay do
defmacro opposite_day(do: block) do
do_opposite(block)
end
def do_opposite({:==, c, a}), do: {:!=, c, a}
def do_opposite({:!=, c, a}), do: {:==, c, a}
def do_opposite({:-, c, a}), do: {:+, c, a}
def do_opposite({:+, c, a}), do: {:-, c, a}
def do_opposite({:*, c, a}), do: {:/, c, a}
def do_opposite({:/, c, a}), do: {:*, c, a}
def do_opposite({:<, c, a}), do: {:>, c, a}
def do_opposite({:>, c, a}), do: {:<, c, a}
def do_opposite({function, context, arguments}) do
{function, context, do_opposite(arguments)}
end
def do_opposite(arguments) when is_list arguments do
for statement <- arguments, do: do_opposite(statement)
end
def do_opposite(x), do: x
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment