General review of Robot class
Looks like you over-thought it a little bit. Callbacks are indeed a powerful abstraction, but it looks overkill in this case. Some notes:


Use symbols to codify @facing: :east, :north, ...
a hint to write move without callbacks:

increments = {:north =&gt; [0, +1], :east =&gt; [+1, 0], :south =&gt; [0, -1], :west =&gt; [-1, 0]}

A hint to write left without callbacks:

new_facing = {:north =&gt; :west, :east =&gt; :north, :south =&gt; :east, :west =&gt; :south}



This way you describe what the robot does not with code (callbacks) but with data structures (which can be as simple as a hash).

As requested: the complete implementation of left:

def left
  new_facing = {:north =&gt; :west, :east =&gt; :north, :south =&gt; :east, :west =&gt; :south}
  @facing = new_facing[@facing]
end