class UbyInterpreter

Constants

INTERNAL_METHODS
VERSION

Attributes

env[RW]
parser[RW]

Public Class Methods

new() click to toggle source
Calls superclass method
# File lib/uby_interpreter.rb, line 38
def initialize
  super

  self.parser = Ruby19Parser.new
  self.env = Environment.new
end

Public Instance Methods

eval(src) click to toggle source
# File lib/uby_interpreter.rb, line 45
def eval src
  process parse src
end
parse(src) click to toggle source
# File lib/uby_interpreter.rb, line 49
def parse src
  self.parser.process src
end
process_array(s) click to toggle source
# File lib/uby_interpreter.rb, line 150
def process_array s
  _, *args = s

  args.map {|arg| arg.last}
end
process_block(s) click to toggle source
# File lib/uby_interpreter.rb, line 108
def process_block s
  result = nil
  s.rest.each do |sub|
    result = process sub
  end
  result
end
process_call(s) click to toggle source
# File lib/uby_interpreter.rb, line 81
def process_call s
  _, recv, msg, *args = s

  recv = process recv
  args.map! {|sub| process sub}

  if recv then
    recv.send(msg, *args)
  else

    if INTERNAL_METHODS.include? "#{msg}"
      process_internal(msg, args)
      return
    end

    self.env.scope do
      decls, body = self.env[msg]

      decls.rest.zip(args).each do |name, val|
        self.env[name] = val
      end

      process_block s(:block, *body)
    end
  end
end
process_defn(s) click to toggle source
# File lib/uby_interpreter.rb, line 127
def process_defn s
  _, name, args, *body = s

  self.env[name] = [args, body]

  nil
end
process_false(s) click to toggle source
# File lib/uby_interpreter.rb, line 77
def process_false s
  false
end
process_hash(s) click to toggle source
# File lib/uby_interpreter.rb, line 156
def process_hash s
  _, *args = s

  args.each_slice(2).inject({}) do |hash, pair|
    (_, key), (_, value) = pair

    hash[key] = value
    hash
  end
end
process_if(s) click to toggle source
# File lib/uby_interpreter.rb, line 57
def process_if s
  _, c, t, f = s

  c = process c

  if c then
    process t
  else
    process f
  end
end
process_internal(msg, *args) click to toggle source
# File lib/uby_interpreter.rb, line 167
def process_internal(msg, *args)
  send("process_#{msg}", args.join)
end
process_lasgn(s) click to toggle source
# File lib/uby_interpreter.rb, line 116
def process_lasgn s
  _, n, v = s

  self.env[n] = process v
end
process_lit(s) click to toggle source
# File lib/uby_interpreter.rb, line 53
def process_lit s
  s.last
end
process_lvar(s) click to toggle source
# File lib/uby_interpreter.rb, line 122
def process_lvar s
  _, n = s
  self.env[n]
end
process_nil(s) click to toggle source
# File lib/uby_interpreter.rb, line 69
def process_nil s
  nil
end
process_p(s) click to toggle source
# File lib/uby_interpreter.rb, line 179
def process_p s
  p s
end
process_print(s) click to toggle source
# File lib/uby_interpreter.rb, line 175
def process_print s
  print s
end
process_puts(s) click to toggle source
# File lib/uby_interpreter.rb, line 171
def process_puts s
  puts s
end
process_str(s) click to toggle source
# File lib/uby_interpreter.rb, line 144
def process_str s
  _, string = s

  string
end
process_true(s) click to toggle source
# File lib/uby_interpreter.rb, line 73
def process_true s
  true
end
process_while(s) click to toggle source
# File lib/uby_interpreter.rb, line 135
def process_while s
  _, cond, *body = s
  body.pop

  while process cond
    process_block s(:block, *body)
  end
end