lib/rouge/repl.rb in rouge-lang-0.0.5 vs lib/rouge/repl.rb in rouge-lang-0.0.6
- old
+ new
@@ -1,37 +1,25 @@
# encoding: utf-8
require 'readline'
-module Rouge::REPL; end
+module Rouge::REPL
-class << Rouge::REPL
- def repl_error(e)
- STDOUT.puts "!! #{e.class}: #{e.message}"
- STDOUT.puts "#{e.backtrace.join "\n"}"
- end
-
- def repl(argv)
- context = Rouge::Context.new Rouge[:user]
+ def self.run!(options = {:backtrace => true})
+ puts "Rouge #{Rouge::VERSION}"
- if ARGV == ["--time-startup"]
- STDOUT.puts Time.now - Rouge.start
- exit(0)
- elsif argv.length == 1
- f = File.read(argv[0])
- if f[0] == ?#
- f = f[f.index("\n") + 1..-1]
- end
+ repl_error = lambda do |e|
+ STDOUT.puts "!! #{e.class}: #{e.message}"
- context.readeval(f)
- exit(0)
- elsif argv.length > 1
- STDERR.puts "!! usage: #$0 [FILE]"
- exit(1)
+ if options[:backtrace]
+ STDOUT.puts "#{e.backtrace.join "\n"}"
+ end
end
+ context = Rouge::Context.new(Rouge[:user])
count = 0
chaining = false
+
while true
if not chaining
prompt = "#{context.ns.name}=> "
input = Readline.readline(prompt, true)
else
@@ -48,19 +36,22 @@
form = context.ns.read(input)
rescue Rouge::Reader::EndOfDataError
chaining = true
next
rescue Rouge::Reader::UnexpectedCharacterError => reader_err
- repl_error reader_err
+ repl_error.call reader_err
end
chaining = false
+
begin
form = Rouge::Compiler.compile(
context.ns,
Set[*context.lexical_keys],
- form)
+ form
+ )
+
result = context.eval(form)
Rouge.print(result, STDOUT)
STDOUT.puts
@@ -71,12 +62,13 @@
context.set_here :"*1", result
rescue Rouge::Context::ChangeContextException => cce
context = cce.context
count = 0
rescue => e
- repl_error e
+ repl_error.call e
end
end
end
+
end
# vim: set sw=2 et cc=80: