class AST::Binary attr_reader :operation, :left, :right def initialize(operation, left, right) @operation = operation @left = left @right = right end def ==(other) other.operation == @operation && other.left == @left && other.right == @right end def execute(env) case @operation when AST::Operators::ADD @left.execute(env) + @right.execute(env) when AST::Operators::SUBTRACT @left.execute(env) - @right.execute(env) when AST::Operators::MULTIPLY @left.execute(env) * @right.execute(env) when AST::Operators::DIVIDE @left.execute(env) / @right.execute(env) when AST::Operators::LESS_THAN @left.execute(env) < @right.execute(env) when AST::Operators::LESS_THAN_OR_EQUAL @left.execute(env) <= @right.execute(env) when AST::Operators::GREATER_THAN @left.execute(env) > @right.execute(env) when AST::Operators::GREATER_THAN_OR_EQUAL @left.execute(env) >= @right.execute(env) when AST::Operators::DOUBLE_EQUALS @left.execute(env) == @right.execute(env) when AST::Operators::OR @left.execute(env) || @right.execute(env) when AST::Operators::AND @left.execute(env) && @right.execute(env) end end end