def math_op op, lhs, rhs, original_exp = nil
if number? lhs and number? rhs
if op == :/ and rhs.value == 0 and not lhs.value.is_a? Float
return original_exp
else
value = lhs.value.send(op, rhs.value)
Sexp.new(:lit, value).line(lhs.line)
end
elsif call? lhs and lhs.method == :+ and number? lhs.first_arg and number? rhs
lhs.first_arg = Sexp.new(:lit, lhs.first_arg.value + rhs.value).line(lhs.first_arg.line)
lhs
elsif safe_literal? lhs or safe_literal? rhs
safe_literal(lhs.line)
else
original_exp
end
end