Chervil is a toy Lisp interpreter written in Ruby
Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.

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