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.



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

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.



4
5
6
# File 'lib/keisan/variables/registry.rb', line 4

def shadowed
  @shadowed
end

Instance Method Details

#[](name) ⇒ Object



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

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



29
30
31
32
# File 'lib/keisan/variables/registry.rb', line 29

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

#has?(name) ⇒ Boolean

Returns:

  • (Boolean)


38
39
40
41
42
# File 'lib/keisan/variables/registry.rb', line 38

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

#localsObject



34
35
36
# File 'lib/keisan/variables/registry.rb', line 34

def locals
  @hash
end

#modifiable?(name) ⇒ Boolean

Returns:

  • (Boolean)


44
45
46
# File 'lib/keisan/variables/registry.rb', line 44

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

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



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

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