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