class Ruspea::Repl::Loop

Public Class Methods

new() click to toggle source
# File lib/ruspea/repl/loop.rb, line 5
def initialize
  @reader = Reader.new
  @evaler = Evaler.new
  @printer = Ruspea::Printer.new
  @env = Ruspea::Runtime::Env.new(Ruspea::Language::Core.new)

  load_repl(@env)
end

Public Instance Methods

run(input: STDIN, env: nil) click to toggle source
# File lib/ruspea/repl/loop.rb, line 14
def run(input: STDIN, env: nil)
  trap "SIGINT" do
    puts "See you soon."
    exit(130)
  end

  env ||= @env
  prompt_back

  while(line = input.gets)
    begin
      interprete(line.chomp, env)
      prompt_back
    rescue Ruspea::Error::Standard => e
      print_error e
    rescue StandardError => e
      puts "A Ruby exception was raised. Inspect it? Y/n"
      yes = !["n", "no"].include?(input.gets.chomp.downcase)
      if yes
        puts "Error: #{e.message}\nBacktrace:\n"
        puts "\s\s#{e.backtrace.join("\n\s\s")}"
      end
      prompt_back
    end
  end

  puts "See you soon."
end

Private Instance Methods

interprete(line, env) click to toggle source
# File lib/ruspea/repl/loop.rb, line 72
def interprete(line, env)
  _, forms = @reader.call(line)
  forms.each do |expression|
    # puts "read: "
    # pp expression
    result = @evaler.call(expression, context: env)
    # puts "evaled: "
    # pp result
    Process.kill("SIGINT", Process.pid) if should_exit?(env)
    print @printer.call(result)
  end
end
load_repl(env) click to toggle source
# File lib/ruspea/repl/loop.rb, line 45
def load_repl(env)
  Dir.glob(
    File.expand_path("../*.rsp", __FILE__)).each do |file|
      puts "loading repl: #{Pathname.new(file).basename}"
      _, forms = @reader.call(File.read(file))
      @evaler.call(forms, context: env)
    end
  puts "repl loaded."
end
print_error(e) click to toggle source
prompt_back(ns: " click to toggle source
# File lib/ruspea/repl/loop.rb, line 55
def prompt_back(ns: "#user")
  puts ""
  print "#{ns}=> "
end
should_exit?(env) click to toggle source
# File lib/ruspea/repl/loop.rb, line 66
def should_exit?(env)
  env.call Ruspea::Runtime::Sym.new("%repl_should_exit?")
rescue Ruspea::Error::Resolution
  false
end