module Chervil class Repl def initialize @env = Env.new end def display(obj) case obj when true '#t' when false '#f' when AST::Function "" when AST::Number display(obj.value) when AST::List "(#{obj.elements.map { |el| display(el) }.join(' ')})" when AST::Quotation "\'#{display(obj.value)}" when AST::Identifier obj.name when Float if obj.floor.to_f == obj obj.to_i else obj end when Array "(#{obj.map { |el| display(el) }.join(' ')})" else obj end end def run begin while line = Readline.readline("> ", true) break if line == "(exit)" lexer = Lexer.new(line) tree = Parser.new(lexer).parse if tree.is_a? Error puts tree next end results = Interpreter.new(tree, @env).interpret results.each { |result| puts display(result) unless result.nil? } end rescue Interrupt puts run end end end end