class Microplane::VM

Implements the basic Microplane VM

Attributes

stack[R]

Public Class Methods

new() click to toggle source
# File lib/microplane/vm.rb, line 12
def initialize
  @stack = []
  @skip = false
  @dictionary = {}
  @libraries = []
  add_library Lib::Std
end
run(code) click to toggle source
# File lib/microplane/vm.rb, line 6
def self.run(code)
  new.evaluate(code).pop
end

Public Instance Methods

add_library(lib) click to toggle source
# File lib/microplane/vm.rb, line 20
def add_library(lib)
  lib.load_words(self)
end
evaluate(code) click to toggle source
# File lib/microplane/vm.rb, line 24
def evaluate(code)
  tokens = code.split
  return define_new_word(tokens) if tokens.first == ':'
  tokens.each do |w|
    next if @skip == true && w != 'fi'
    parse(w)
  end
  self
end
pop() click to toggle source
# File lib/microplane/vm.rb, line 34
def pop
  stack.pop
end

Private Instance Methods

define_new_word(tokens) click to toggle source
# File lib/microplane/vm.rb, line 40
def define_new_word(tokens)
  word = tokens[1]
  @dictionary[word] = tokens[2..-2].join(' ')
end
number?(w) click to toggle source
# File lib/microplane/vm.rb, line 57
def number?(w)
  w.getbyte(0) >= 48 && w.getbyte(0) <= 57
end
parse(w) click to toggle source
# File lib/microplane/vm.rb, line 49
def parse(w)
  return push(w.to_i) if number?(w)
  word = @dictionary[w]
  raise "Unknown Word #{w}" unless word
  return word.call if word.is_a?(Proc)
  evaluate(word)
end
push(obj) click to toggle source
# File lib/microplane/vm.rb, line 45
def push(obj)
  stack << obj
end