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