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
# File lib/ruspea/repl/loop.rb, line 60 def print_error(e) puts e.class puts e.message prompt_back end
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