Chervil is a toy Lisp interpreter written in Ruby
您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

repl.rb 923B

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  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 Float
  15. if obj.floor.to_f == obj
  16. obj.to_i
  17. else
  18. obj
  19. end
  20. else
  21. obj
  22. end
  23. end
  24. def run
  25. begin
  26. while line = Readline.readline("> ", true)
  27. break if line == "(exit)"
  28. lexer = Lexer.new(line)
  29. tree = Parser.new(lexer).parse
  30. if tree.is_a? Error
  31. puts tree
  32. next
  33. end
  34. results = Interpreter.new(tree, @env).interpret
  35. results.each { |result| puts display(result) unless result.nil? }
  36. end
  37. rescue Interrupt
  38. puts
  39. repl(@env)
  40. end
  41. end
  42. end
  43. end