class Lisp::REPL

Attributes

input[R]
io[R]

Public Class Methods

new() click to toggle source
# File lib/lisp/repl.rb, line 8
def initialize
  @io = Coolline.new do |config|
    config.transform_proc = proc do
      CodeRay.scan(config.line, :clojure).term
    end
  end

  reset_input!
end

Public Instance Methods

run() click to toggle source
# File lib/lisp/repl.rb, line 18
def run
  trap("SIGINT") { throw :exit }

  puts "ctrl-c to exit"

  catch(:exit) do
    loop do
      begin
        @input += io.readline prompt

        if open_count == close_count
          puts Lisp.eval input

          reset_input!
        end
      rescue Exception => e
        puts e.message

        reset_input!
      end
    end
  end
end

Private Instance Methods

close_count() click to toggle source
# File lib/lisp/repl.rb, line 58
def close_count
  tokens.count(?))
end
open_count() click to toggle source
# File lib/lisp/repl.rb, line 54
def open_count
  tokens.count(?()
end
prompt() click to toggle source
# File lib/lisp/repl.rb, line 44
def prompt
  count = open_count - close_count
  char  = count > 0 ? ?( : ?)
  "#{char * count}> "
end
reset_input!() click to toggle source
# File lib/lisp/repl.rb, line 50
def reset_input!
  @input = String.new
end
tokens() click to toggle source
# File lib/lisp/repl.rb, line 62
def tokens
  Lisp.tokenize input
end