...

/

Leveraging the Virtual Machine’s Pattern Matching Engine

Leveraging the Virtual Machine’s Pattern Matching Engine

Learn how to make the virtual machine do maximum work while keeping our code clear and concise.

We'll cover the following...

The Assertion module

Now that our assert macro is in place, we can implement the proxy assert functions in a new Assertion.Test module. The Assertion.Test module will carry out the work of performing the assertions and running our tests.

When we find ourselves at a stage in code where we’ve proxied out to a function that we are about to implement, try to think about how pattern matching can help guide our implementation. Let’s see how to use the virtual machine while doing it.

We’ll change the project used in our previous example in the following way:

defmodule Assertion do

  defmacro assert({operator, _, [lhs, rhs]}) do
    quote bind_quoted: [operator: operator, lhs: lhs, rhs: rhs] do
      Assertion.Test.assert(operator, lhs, rhs)                     
    end
  end
end

defmodule Assertion.Test do                                         
  def assert(:==, lhs, rhs) when lhs == rhs do
    IO.write "."
  end
  def assert(:==, lhs, rhs) do
    IO.puts """
    FAILURE:
      Expected:       #{lhs}
      to be equal to: #{rhs}
    """
  end

  def assert(:>, lhs, rhs) when lhs > rhs do
    IO.write "."
  end
  def assert(:>, lhs, rhs) do
    IO.puts """
    FAILURE:
      Expected:           #{lhs}
      to be greater than: #{rhs}
    """
  end
end
Defining `Assertion` module with `assert` macro.

By ...