class Keisan::Variables::Registry

Attributes

shadowed[R]

Public Class Methods

new(variables: {}, shadowed: [], parent: nil, use_defaults: true, force: false) click to toggle source
# 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

Public Instance Methods

[](name) click to toggle source
# 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
freeze() click to toggle source
Calls superclass method
# File lib/keisan/variables/registry.rb, line 31
def freeze
  @hash.values.each(&:freeze)
  super
end
has?(name) click to toggle source
# File lib/keisan/variables/registry.rb, line 40
def has?(name)
  !self[name].nil?
rescue Exceptions::UndefinedVariableError
  false
end
locals() click to toggle source
# File lib/keisan/variables/registry.rb, line 36
def locals
  @hash
end
modifiable?(name) click to toggle source
# File lib/keisan/variables/registry.rb, line 46
def modifiable?(name)
  !frozen? && has?(name)
end
register!(name, value, force: false) click to toggle source
# 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

Protected Instance Methods

has_name?(name) click to toggle source

For checking if locally defined

# File lib/keisan/variables/registry.rb, line 60
def has_name?(name)
  @hash.has_key?(name)
end

Private Instance Methods

[]=(name, value) click to toggle source
# File lib/keisan/variables/registry.rb, line 66
def []=(name, value)
  @hash[name] = value
end
default_registry() click to toggle source
# File lib/keisan/variables/registry.rb, line 70
def default_registry
  DefaultRegistry.registry
end