Skip to main content

if, unless, and cond

Here's something weird to think about: in a high-level functional language such as Elixir, writing conditional code is not exactly idiomatic. Using a combination of pattern matching and syntax rules we can write extremely clean code free of if statements and conditionals in general

One thing I dislike about most code books is they tell you about syntax rules, but not about how people actually write the code in the wild. I need you to write solid code here at Red:4, so let's take a second to talk about style.

If You Need "if"

Let's revisit our Solar module's power function. When I first wrote it, I did what most programmers would do:

defmodule Solar do
  def power(flare) do
    factor = 1
    if(flare.classification == :M) do
      factor = 10
    end
    if(flare.classification == :X) do
      factor = 1000
    end
    factor * flare.scale
  end
end

This code isn't bad, necessarily, but you'll notice the lack of else if here. Which is OK, as that's basically the same thing as a bunch of if statements.

The interesting thing about if (and unless) in Elixir is that they're not really a part of the language - they're macros:

An interesting note regarding if/2 and unless/2 is that they are implemented as macros in the language; they arenโ€™t special language constructs as they would be in many languages. You can check the documentation and the source of if/2 in the Kernel module docs...

An if (or unless) statement is generally only used when you have a single condition you want to evaluate and they aren't used very often. In fact, I've written a number of Elixir libraries (some quite large) as well as a pretty large ecommerce application. I have, perhaps, two if statements (if that) in all of the Elixir code I've ever written.

You just don't need them when you have pattern matching and smaller, isolated functions.

Updated on Nov 14, 2025