class Keisan::AST::Hash
Public Class Methods
new(key_value_pairs)
click to toggle source
# File lib/keisan/ast/hash.rb, line 6 def initialize(key_value_pairs) @hash = ::Hash[key_value_pairs.map(&:to_a).map {|k,v| [k.value, v.to_node]}] end
Public Instance Methods
[](key)
click to toggle source
# File lib/keisan/ast/hash.rb, line 15 def [](key) key = key.to_node return nil unless key.is_a?(AST::ConstantLiteral) @hash[key.value] || Cell.new(Null.new).tap do |cell| @hash[key.value] = cell end end
each(&block)
click to toggle source
# File lib/keisan/ast/hash.rb, line 57 def each(&block) @hash.each(&block) end
evaluate(context = nil)
click to toggle source
# File lib/keisan/ast/hash.rb, line 36 def evaluate(context = nil) return self if frozen? context ||= Context.new @hash = ::Hash[ @hash.map do |key, val| if val.is_a?(Cell) [key, val] else [key, val.evaluate(context)] end end ] self end
freeze()
click to toggle source
Calls superclass method
# File lib/keisan/ast/hash.rb, line 10 def freeze values.each(&:freeze) super end
is_constant?()
click to toggle source
# File lib/keisan/ast/hash.rb, line 94 def is_constant? @hash.all? {|k,v| v.is_constant?} end
keys()
click to toggle source
# File lib/keisan/ast/hash.rb, line 61 def keys @hash.keys end
simplify(context = nil)
click to toggle source
# File lib/keisan/ast/hash.rb, line 53 def simplify(context = nil) evaluate(context) end
to_cell()
click to toggle source
# File lib/keisan/ast/hash.rb, line 84 def to_cell h = self.class.new([]) h.instance_variable_set(:@hash, ::Hash[ @hash.map do |key, value| [key, value.to_cell] end ]) AST::Cell.new(h) end
to_s()
click to toggle source
# File lib/keisan/ast/hash.rb, line 80 def to_s "{#{@hash.map {|k,v| "#{k.is_a?(::String) ? "'#{k}'" : k}: #{v}"}.join(', ')}}" end
traverse(&block)
click to toggle source
Calls superclass method
# File lib/keisan/ast/hash.rb, line 24 def traverse(&block) value = super(&block) return value if value @hash.each do |k, v| value = k.to_node.traverse(&block) return value if value value = v.traverse(&block) return value if value end false end
value(context = nil)
click to toggle source
# File lib/keisan/ast/hash.rb, line 69 def value(context = nil) context ||= Context.new evaluate(context) ::Hash[ @hash.map {|key, val| [key, val.value(context)] } ] end
values()
click to toggle source
# File lib/keisan/ast/hash.rb, line 65 def values @hash.values end