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.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  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 AST::Identifier
  21. obj.name
  22. when Float
  23. if obj.floor.to_f == obj
  24. obj.to_i
  25. else
  26. obj
  27. end
  28. when Array
  29. "(#{obj.map { |el| display(el) }.join(' ')})"
  30. else
  31. obj
  32. end
  33. end
  34. def run
  35. begin
  36. while line = Readline.readline("> ", true)
  37. break if line == "(exit)"
  38. lexer = Lexer.new(line)
  39. tree = Parser.new(lexer).parse
  40. if tree.is_a? Error
  41. puts tree
  42. next
  43. end
  44. results = Interpreter.new(tree, @env).interpret
  45. results.each { |result| puts display(result) unless result.nil? }
  46. end
  47. rescue Interrupt
  48. puts
  49. run
  50. end
  51. end
  52. end
  53. end