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