Chervil is a toy Lisp interpreter written in Ruby
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

repl.rb 1.1KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. module Chervil
  2. class Repl
  3. def initialize
  4. @env = Env.new
  5. end
  6. def display(obj)
  7. case obj
  8. when true
  9. '#t'
  10. when false
  11. '#f'
  12. when AST::Function
  13. "<function: #{obj.name.name}(#{obj.params.map(&:name).join(' ')})>"
  14. when AST::Number
  15. display(obj.value)
  16. when AST::List
  17. "(#{obj.elements.map { |el| display(el) }.join(' ')})"
  18. when AST::Quotation
  19. "\'#{display(obj.value)}"
  20. when Float
  21. if obj.floor.to_f == obj
  22. obj.to_i
  23. else
  24. obj
  25. end
  26. else
  27. obj
  28. end
  29. end
  30. def run
  31. begin
  32. while line = Readline.readline("> ", true)
  33. break if line == "(exit)"
  34. lexer = Lexer.new(line)
  35. tree = Parser.new(lexer).parse
  36. if tree.is_a? Error
  37. puts tree
  38. next
  39. end
  40. results = Interpreter.new(tree, @env).interpret
  41. results.each { |result| puts display(result) unless result.nil? }
  42. end
  43. rescue Interrupt
  44. puts
  45. run
  46. end
  47. end
  48. end
  49. end