Macro Guard Clauses in Elixir
Have you ever wanted to pass your own custom function into a guard clause?
Lets start by looking at a super basic guard clause here:
def greater_than_10(num) when num > 10, do: true
def greater_than_10(_), do: false
Let's say we want to get more specific with the operation inside of the when
guard. This is overkill for our situation, but lets say we want the when
to use a custom function of ours instead of a basic operation, but when
guards don't allow you to directly pass functions to them.
Elixir has a fancy macro called defguard
that allows you to define custom guards like functions. Let's change our function up and define a guard that checks if our argument is both a integer and even.
defmodule Guards do
defguard is_even_num(num) when is_integer(value) and rem(value, 2) == 0
end
Let's use that guard in our function
import Guards
def even_num_greater_than_10(num) when is_even_num(num) do
case num > 10 do
true -> true
_ -> false
end
end
Even though this example is a bit overkill, the option to use custom guards is a cool elixir feature.
Tweet