diff --git a/lib/dentaku/calculator.rb b/lib/dentaku/calculator.rb
index <HASH>..<HASH> 100644
--- a/lib/dentaku/calculator.rb
+++ b/lib/dentaku/calculator.rb
@@ -52,6 +52,8 @@ module Dentaku
         expression_dependencies)
 
       results = variables_in_resolve_order.each_with_object({}) do |var_name, r|
+        expr = Expression.new(expressions[var_name], @memory.merge(expressions))
+        raise UnboundVariableError.new(expr.identifiers) if expr.unbound?
         r[var_name] = evaluate!(expressions[var_name], r)
       end
 
diff --git a/spec/calculator_spec.rb b/spec/calculator_spec.rb
index <HASH>..<HASH> 100644
--- a/spec/calculator_spec.rb
+++ b/spec/calculator_spec.rb
@@ -87,6 +87,12 @@ describe Dentaku::Calculator do
       result = with_memory.solve!(total_fruit: "Apples + pears", pears: 10)
       expect(result[:total_fruit]).to eq 13
     end
+
+    it "lets you know if a variable is unbound" do
+      expect {
+        calculator.solve!(more_apples: "apples + 1")
+      }.to raise_error(Dentaku::UnboundVariableError)
+    end
   end
 
   it 'evaluates a statement with no variables' do
raise unbound variable error in `solve!`

check each expression in `solve!` prior to evaluation to determine if it
has any unbound variables.