class Theta::Interpreter
interpret scheme code
Attributes
current_environment[RW]
Public Class Methods
new()
click to toggle source
initialize the environment and the parser
# File lib/theta/interpreter.rb, line 11 def initialize @global_environment = @current_environment = Environment.new @parser = Parser.new load_library end
Public Instance Methods
evaluate(expression)
click to toggle source
evaluate the scheme expression
# File lib/theta/interpreter.rb, line 47 def evaluate(expression) if expression.is_a? Symbol return @current_environment.find(expression) elsif not expression.is_a? Array return expression end case expression[0] when :define @current_environment.define(expression [1], evaluate(expression[2])) when :ruby_func return eval expression[1] else function = evaluate(expression[0]) if function.is_a? Proc arguments = expression[1, expression.length] return function.call(arguments, self) else raise RuntimeError, "#{expression[0]} is not a function" end end return nil end
load_library()
click to toggle source
load any predefined library files
# File lib/theta/interpreter.rb, line 18 def load_library library_directory = File.expand_path(File.join(File.dirname(__FILE__), "library")) Dir.foreach(library_directory) do |file| if file != "." && file != ".." f = File.open(File.join(library_directory, file)) run(f.read) end end end
make_readable(value)
click to toggle source
call the parser to make something readable
# File lib/theta/interpreter.rb, line 42 def make_readable(value) @parser.to_string(value) end
parse(string)
click to toggle source
call the parser to make a string interpretable
# File lib/theta/interpreter.rb, line 37 def parse(string) @parser.parse(string) end
run(program)
click to toggle source
run some code
# File lib/theta/interpreter.rb, line 29 def run(program) expression = parse(program) output = [] expression.each { |e| output << evaluate(e) } return output.delete_if { |x| x.nil? } end