123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657 |
- module Chervil
- class Repl
- def initialize
- @env = Env.new
- end
-
- def display(obj)
- case obj
- when true
- '#t'
- when false
- '#f'
- when AST::Function
- "<function: #{obj.name.name}(#{obj.params.map(&:name).join(' ')})>"
- 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
|