Class: Keisan::AST::Hash

Inherits:
Node
  • Object
show all
Includes:
Enumerable
Defined in:
lib/keisan/ast/hash.rb

Instance Method Summary collapse

Methods inherited from Node

#!, #%, #&, #*, #**, #+, #+@, #-, #-@, #/, #<, #<<, #<=, #>, #>=, #>>, #^, #and, #coerce, #contains_a?, #deep_dup, #differentiate, #differentiated, #equal, #evaluate_assignments, #evaluated, #false?, #not_equal, #or, #replace, #replaced, #simplified, #to_node, #true?, #unbound_functions, #unbound_variables, #well_defined?, #|, #~

Constructor Details

#initialize(key_value_pairs) ⇒ Hash

Returns a new instance of Hash.



6
7
8
# 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

Instance Method Details

#[](key) ⇒ Object



15
16
17
18
19
20
21
22
# 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) ⇒ Object



57
58
59
# File 'lib/keisan/ast/hash.rb', line 57

def each(&block)
  @hash.each(&block)
end

#evaluate(context = nil) ⇒ Object



36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
# 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

#freezeObject



10
11
12
13
# File 'lib/keisan/ast/hash.rb', line 10

def freeze
  values.each(&:freeze)
  super
end

#is_constant?Boolean

Returns:



94
95
96
# File 'lib/keisan/ast/hash.rb', line 94

def is_constant?
  @hash.all? {|k,v| v.is_constant?}
end

#keysObject



61
62
63
# File 'lib/keisan/ast/hash.rb', line 61

def keys
  @hash.keys
end

#simplify(context = nil) ⇒ Object



53
54
55
# File 'lib/keisan/ast/hash.rb', line 53

def simplify(context = nil)
  evaluate(context)
end

#to_cellObject



84
85
86
87
88
89
90
91
92
# 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_sObject



80
81
82
# 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) ⇒ Object



24
25
26
27
28
29
30
31
32
33
34
# 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) ⇒ Object



69
70
71
72
73
74
75
76
77
78
# 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

#valuesObject



65
66
67
# File 'lib/keisan/ast/hash.rb', line 65

def values
  @hash.values
end