MathEngine is a lightweight mathematical expression parser and evaluator. It currently handles addition, subtraction, multiplication, division, exponent, modulus and the use of variables and pre-defined functions.
Install with
gem install math_engine
The only dependency is lexr, which is really lightweight and has no external dependencies.
require 'rubygems'
require 'math_engine'
engine = MathEngine.new
puts "#{engine.evaluate("x = 10 * (3 * 2) + (55 - 5) / (2.5 * (3 + 1))")}"
puts "#{engine.evaluate("x + 5")}"
results in an output of
65.0
70.0
extending is easy using functions, you can add single functions using MathEngine.define
engine.context.define :add_em do |x, y|
x + y
end
or you can write all your functions in a class and add the class
class SomeFunctions
def add_em(x, y)
x + y
end
end
engine.context.include_library SomeFunctions.new
and calling them with
engine.evaluate("1 + 1 + add_em(2, 2)")
All functions are pulled in from the built in Math class by default, so all the standard ruby math functions are available (cos, sin, tan etc)
if you missed a closing parenthesis, had an operator where it wasn't meant to be, you might get something like this:
Unexpected multiplication(*), expected: number, variable name or open_parenthesis
and that is pretty much every feature so far. Please let me know of any bugs or additions that you'd like to see!
Mario de la Ossa (mdelaossa): Handling of complex numbers and upgraded to work with 1.9.X
See the LICENSE file included with the distribution for licensing and copyright details.