Class: Keisan::Variables::Registry

Inherits:
Object
  • Object
show all
Defined in:
lib/keisan/variables/registry.rb

Direct Known Subclasses

DefaultRegistry

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(variables: {}, shadowed: [], parent: nil, use_defaults: true, force: false) ⇒ Registry

Returns a new instance of Registry.



8
9
10
11
12
13
14
15
16
17
# File 'lib/keisan/variables/registry.rb', line 8

def initialize(variables: {}, shadowed: [], parent: nil, use_defaults: true, force: false)
  @hash = {}
  @shadowed = ::Set.new(shadowed.map(&:to_s))
  @parent = parent
  @use_defaults = use_defaults

  variables.each do |name, value|
    register!(name, value, force: force)
  end
end

Instance Attribute Details

#shadowedObject (readonly)

Returns the value of attribute shadowed.



6
7
8
# File 'lib/keisan/variables/registry.rb', line 6

def shadowed
  @shadowed
end

Instance Method Details

#[](name) ⇒ Object



19
20
21
22
23
24
25
26
27
28
29
# File 'lib/keisan/variables/registry.rb', line 19

def [](name)
  return @hash[name] if @hash.has_key?(name)
  raise Exceptions::UndefinedVariableError.new if @shadowed.include?(name)

  if @parent && (parent_value = @parent[name])
    return parent_value
  end

  return default_registry[name] if @use_defaults && default_registry.has_name?(name)
  raise Exceptions::UndefinedVariableError.new name
end

#freezeObject



31
32
33
34
# File 'lib/keisan/variables/registry.rb', line 31

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

#has?(name) ⇒ Boolean

Returns:

  • (Boolean)


40
41
42
43
44
# File 'lib/keisan/variables/registry.rb', line 40

def has?(name)
  !self[name].nil?
rescue Exceptions::UndefinedVariableError
  false
end

#localsObject



36
37
38
# File 'lib/keisan/variables/registry.rb', line 36

def locals
  @hash
end

#modifiable?(name) ⇒ Boolean

Returns:

  • (Boolean)


46
47
48
# File 'lib/keisan/variables/registry.rb', line 46

def modifiable?(name)
  !frozen? && has?(name)
end

#register!(name, value, force: false) ⇒ Object



50
51
52
53
54
55
# File 'lib/keisan/variables/registry.rb', line 50

def register!(name, value, force: false)
  raise Exceptions::UnmodifiableError.new("Cannot modify frozen variables registry") if frozen?
  name = name.to_s

  self[name.to_s] = value.to_node.to_cell
end