Expanding Control Guard Clauses
Explore how to control program flow in Elixir using guard clauses with the when keyword and macros. This lesson shows you how to reduce auxiliary functions, enforce input conditions, and create reusable guard macros. Understand Elixir's approach to type checking and implementation of bitwise operations within guard clauses, enhancing your functional programming skills.
Introduction to guard clauses
Creating multiple functions with pattern matching to control the program flow can be exhausting sometimes. In the example where we made the NumberCompare module, we have to build auxiliary functions to handle the >= operation result. Creating too many functions for trivial tasks can generate code that is hard to maintain. We can improve this using Elixir guard clauses. Guard clauses permit us to add Boolean expressions in our functions, adding more power to our function clauses.
Creating the guard clause
We can create guard clauses by using the when keyword after functions’ parameters. Let’s see how it works for improving our NumberCompare code:
defmodule NumberCompare do
def greater(number, other_number) when number >= other_number, do: number
def greater(_, other_number), do: other_number
endRunning the above will launch a terminal. Try the code below in it:
$ iex
iex> c("number_compare.ex")
iex> NumberCompare.greater(2, 8)
#Output -> 8
We’ve used the guard clauses to check which number is greater; one function returns the first number, and the other returns the second. The expression when number >= other_number is the guard clause. The function will be executed when it’s true, returning the variable number. When the expression is false, it will try to run the second function clause. The second clause will always match because it doesn’t have any checks to prevent execution.
Guard clauses help us create better function signatures and, reduce the need for function helpers. We can also use guard clauses to enforce which data we’re expecting. Let’s improve the Checkout module that we created in the previous ...