Sha256: 5fd295e0adc996346f59d5b9242a675052ecaa821982a5c068ed5ba3bb5410dd
Contents?: true
Size: 1.73 KB
Versions: 2
Compression:
Stored size: 1.73 KB
Contents
require "shuwar/stdlib" module Shuwar class Runtime attr_accessor :value_table, :marco_table def initialize @value_table = {} @marco_table = {} @loaded_libs = [] load_lib :base end def dup a = super a.value_table = a.value_table.dup a.marco_table = a.marco_table.dup a end def load_lib(name) return if @loaded_libs.include? name @loaded_libs.push name vs, ms = Shuwar::Stdlib.load name @value_table.merge! vs @marco_table.merge! ms end def set_value(key, val) raise "Why set value to a non-symbol?" unless key.is_a? Symbol @value_table[key] = val end def get_value(key) raise "Why reference a non-symbol?" unless key raise "No value for #{key}" unless has_value? key @value_table[key] end def has_value?(key) @value_table.has_key? key end def new_func(key, &block) raise "There's already a function #{key}" if @value_table.has_key? key set_value(key, block) end def new_marco(key, &block) raise "There's already a marco #{key}" if @marco_table.has_key? key raise "Why set value to a non-symbol?" unless key.is_a? Symbol @marco_table[key] = block end def call_marco(key, *args) self.instance_exec *args, &@marco_table[key] end def has_marco?(key) @marco_table.has_key? key end def evaluate(x) case x when Array if x.empty? nil elsif has_marco? x[0] call_marco *x else lambda{|f,*as| self.instance_exec *as, &f}.call *x.map{|a| evaluate a } end when Symbol get_value x else x end end end end
Version data entries
2 entries across 2 versions & 1 rubygems
Version | Path |
---|---|
shuwar-1.3.0 | lib/shuwar/runtime.rb |
shuwar-1.2.0 | lib/shuwar/runtime.rb |