class Kalculator::Evaluator
Public Class Methods
new(data_source, custom_functions = {})
click to toggle source
# File lib/kalculator/evaluator.rb, line 4 def initialize(data_source, custom_functions = {}) @data_source = data_source @functions = Kalculator::BUILT_IN_FUNCTIONS.merge(custom_functions) end
Public Instance Methods
!=(_, left, right, metadata)
click to toggle source
# File lib/kalculator/evaluator.rb, line 65 def !=(_, left, right, metadata) evaluate(left) != evaluate(right) end
*(_, left, right, metadata)
click to toggle source
# File lib/kalculator/evaluator.rb, line 37 def *(_, left, right, metadata) evaluate(left) * evaluate(right) end
+(_, left, right, metadata)
click to toggle source
# File lib/kalculator/evaluator.rb, line 29 def +(_, left, right, metadata) evaluate(left) + evaluate(right) end
-(_, left, right, metadata)
click to toggle source
# File lib/kalculator/evaluator.rb, line 33 def -(_, left, right, metadata) evaluate(left) - evaluate(right) end
/(_, left, right, metadata)
click to toggle source
# File lib/kalculator/evaluator.rb, line 41 def /(_, left, right, metadata) evaluate(left) / evaluate(right) end
<(_, left, right, metadata)
click to toggle source
# File lib/kalculator/evaluator.rb, line 53 def <(_, left, right, metadata) evaluate(left) < evaluate(right) end
<=(_, left, right, metadata)
click to toggle source
# File lib/kalculator/evaluator.rb, line 57 def <=(_, left, right, metadata) evaluate(left) <= evaluate(right) end
==(_, left, right, metadata)
click to toggle source
# File lib/kalculator/evaluator.rb, line 61 def ==(_, left, right, metadata) evaluate(left) == evaluate(right) end
>(_, left, right, metadata)
click to toggle source
# File lib/kalculator/evaluator.rb, line 45 def >(_, left, right, metadata) evaluate(left) > evaluate(right) end
>=(_, left, right, metadata)
click to toggle source
# File lib/kalculator/evaluator.rb, line 49 def >=(_, left, right, metadata) evaluate(left) >= evaluate(right) end
access(_, identifier, object, metadata)
click to toggle source
# File lib/kalculator/evaluator.rb, line 15 def access(_, identifier, object, metadata) a = evaluate(object) if(a.key?(identifier)) b =a[identifier] if(b.is_a?(Kalculator::Pointer)) b = @data_source[b.p] end if(b.is_a?(Kalculator::AnonymousPointer)) b = b.p end return b end raise UndefinedVariableError.new(metadata), "object #{a} doesn't have attribute #{identifier}" end
and(_, left, right, metadata)
click to toggle source
# File lib/kalculator/evaluator.rb, line 69 def and(_, left, right, metadata) evaluate(left) && evaluate(right) end
boolean(_, boolean,_, metadata)
click to toggle source
# File lib/kalculator/evaluator.rb, line 77 def boolean(_, boolean,_, metadata) boolean end
evaluate(ast)
click to toggle source
# File lib/kalculator/evaluator.rb, line 10 def evaluate(ast) send(ast.first, *ast) end
exists(_, variable, metadata)
click to toggle source
# File lib/kalculator/evaluator.rb, line 81 def exists(_, variable, metadata) @data_source.key?(variable) end
fn_call(_, fn_name, expressions, metadata)
click to toggle source
# File lib/kalculator/evaluator.rb, line 85 def fn_call(_, fn_name, expressions, metadata) key = [fn_name, expressions.count] fn = @functions[key] raise UndefinedFunctionError.new(metadata), "no such function #{fn_name}/#{expressions.count}" if fn.nil? args = expressions.map{|expression| evaluate(expression) } return fn.call(*args) end
if(_, condition, true_clause, false_clause, metadata)
click to toggle source
# File lib/kalculator/evaluator.rb, line 93 def if(_, condition, true_clause, false_clause, metadata) if evaluate(condition) evaluate(true_clause) else evaluate(false_clause) end end
list(_, expressions, metadata)
click to toggle source
# File lib/kalculator/evaluator.rb, line 101 def list(_, expressions, metadata) expressions.map{|expression| evaluate(expression) } end
not(_, expression, metadata)
click to toggle source
# File lib/kalculator/evaluator.rb, line 105 def not(_, expression, metadata) bool = evaluate(expression) !bool end
null(_, _,_, metadata)
click to toggle source
# File lib/kalculator/evaluator.rb, line 110 def null(_, _,_, metadata) nil end
number(_, number,_, metadata)
click to toggle source
# File lib/kalculator/evaluator.rb, line 114 def number(_, number,_, metadata) number end
or(_, left, right, metadata)
click to toggle source
# File lib/kalculator/evaluator.rb, line 73 def or(_, left, right, metadata) evaluate(left) || evaluate(right) end
percent(_, percent,_, metadata)
click to toggle source
# File lib/kalculator/evaluator.rb, line 118 def percent(_, percent,_, metadata) percent / 100.0 end
string(_, string,_, metadata)
click to toggle source
# File lib/kalculator/evaluator.rb, line 122 def string(_, string,_, metadata) string end
variable(_, name, metadata)
click to toggle source
# File lib/kalculator/evaluator.rb, line 126 def variable(_, name, metadata) raise UndefinedVariableError.new(metadata), "undefined variable #{name}" unless @data_source.key?(name) a = @data_source[name] if(a.is_a?(Pointer)) a = @data_source[a.p] end if(a.is_a?(Kalculator::AnonymousPointer)) a = a.p end return a end