Module: Optimus::ParsedCalculator::Evaluators::Binary

Included in:
BinaryExpr
Defined in:
lib/expression_parser/evaluators.rb

Overview

Actual functions to evaluate binary expressions such as 1+1 and 5%3. Here is where we get to say what our operators actually do!

Constant Summary collapse

Plus =
lambda {|lval, rval|
  args = ArgList.new(lval, rval)
  return lval+rval if args.all_num?
  return NaN
}
Minus =
lambda {|lval, rval|
  args = ArgList.new(lval, rval)
  return lval-rval if args.all_num?
  return NaN
}
Times =
lambda {|lval, rval|
  args = ArgList.new(lval, rval)
  return lval*rval if args.all_num?
  return NaN
}
Div =
lambda {|lval, rval|
  args = ArgList.new(lval, rval)
  return NaN if rval.to_f == 0.0
  return lval.to_f/rval.to_f
}
Mod =
lambda {|lval, rval|
  args = ArgList.new(lval, rval)
  return lval%rval if args.all_num?
  return NaN
}
Concat =
lambda {|lval, rval|
  return lval.to_s+rval.to_s
}
And =
lambda {|lval, rval|
  args = ArgList.new(lval, rval)
  cl, cr = args.bool_cast
  return (cl and cr)
}
Or =
lambda {|lval, rval|
  args = ArgList.new(lval, rval)
  cl, cr = args.bool_cast
  return (cl or cr)
}
Equals =
lambda {|lval, rval|
  args = ArgList.new(lval, rval)
  cl, cr = args.cast_for_comparison
  return cl == cr
}
NotEquals =
lambda {|lval, rval|
  args = ArgList.new(lval, rval)
  cl, cr = args.cast_for_comparison
  return cl != cr
}
GreaterThan =
lambda {|lval, rval|
  args = ArgList.new(lval, rval)
  cl, cr = args.cast_for_comparison
  begin
    return cl > cr
  rescue ArgumentError => e
    return false
  end
}
LessThan =
lambda {|lval, rval|
  args = ArgList.new(lval, rval)
  cl, cr = args.cast_for_comparison
  begin
    return cl < cr
  rescue ArgumentError => e
    return false
  end
}
GreaterThanEquals =
lambda {|lval, rval|
  args = ArgList.new(lval, rval)
  cl, cr = args.cast_for_comparison
  begin
    return cl >= cr
  rescue ArgumentError => e
    return false
  end
}
LessThanEquals =
lambda {|lval, rval|
  args = ArgList.new(lval, rval)
  cl, cr = args.cast_for_comparison
  begin
    return cl <= cr
  rescue ArgumentError => e
    return false
  end
}
OpTable =
{
  :+ => Plus,
  :- => Minus,
  :* => Times,
  :/ => Div,
  :% => Mod,
  :& => Concat,
  :and => And,
  :or => Or,
  '='.to_sym => Equals,
  '!='.to_sym => NotEquals,
  :> => GreaterThan,
  :< => LessThan,
  :>= => GreaterThanEquals,
  :<= => LessThanEquals
}