Class: Rus3::Evaluator::SchemeEvaluator

Inherits:
Evaluator
  • Object
show all
Defined in:
lib/rus3/evaluator/scheme_evaluator.rb

Constant Summary collapse

EVALUATOR_VERSION =
"0.2.0"
ARITHMETIC_OPS_MAP =
{
  "+"  => "add",
  "-"  => "subtract",
  "*"  => "mul",
  "/"  => "div",
  "%"  => "mod",
}
COMPARISON_OPS_MAP =
{
  "<"  => "lt?",
  "<=" => "le?",
  ">"  => "gt?",
  ">=" => "ge?",
  "=" => "same_value?",
}

Instance Attribute Summary

Attributes inherited from Evaluator

#verbose

Instance Method Summary collapse

Constructor Details

#initializeSchemeEvaluator

Returns a new instance of SchemeEvaluator.



18
19
20
21
22
23
24
25
# File 'lib/rus3/evaluator/scheme_evaluator.rb', line 18

def initialize
  super

  @env = Environment.new
  @translator = Translator.new
  @translator.add_procedure_map(ARITHMETIC_OPS_MAP)
  @translator.add_procedure_map(COMPARISON_OPS_MAP)
end

Instance Method Details

#bindingObject



46
47
48
# File 'lib/rus3/evaluator/scheme_evaluator.rb', line 46

def binding
  @env.binding
end

#eval(ast) ⇒ Object



40
41
42
43
44
# File 'lib/rus3/evaluator/scheme_evaluator.rb', line 40

def eval(ast)
  ruby_source = translate_ast(ast)
  pp ruby_source if @verbose
  @env.binding.eval(ruby_source)
end

#instance_eval(&proc) ⇒ Object



36
37
38
# File 'lib/rus3/evaluator/scheme_evaluator.rb', line 36

def instance_eval(&proc)
  @env.binding.receiver.instance_eval(&proc)
end

#instance_variable_set(var, value) ⇒ Object



32
33
34
# File 'lib/rus3/evaluator/scheme_evaluator.rb', line 32

def instance_variable_set(var, value)
  @env.binding.receiver.instance_variable_set(var, value)
end

#verbose=(verbose) ⇒ Object



27
28
29
30
# File 'lib/rus3/evaluator/scheme_evaluator.rb', line 27

def verbose=(verbose)
  super
  @translator and @translator.verbose = verbose
end

#versionObject



10
11
12
13
14
15
16
# File 'lib/rus3/evaluator/scheme_evaluator.rb', line 10

def version
  vmsg = "(scheme-evaluator :version #{EVALUATOR_VERSION})"
  if @translator
    vmsg += " #{@translator.version}"
  end
  super + " (#{vmsg})"
end