File: environment/context/value/abstract.rb

Overview
Module Structure
Class Hierarchy
Code

Overview

Module Structure

  module: <Toplevel Module>
  module: Umu#6
  module: Environment#8
  module: Context#10
  module: Value#12
  class: Abstract#14
inherits from
  Collection ( Umu::Abstraction )
has properties
method: each #15
method: get_bindings #28
method: lookup / 3 #33
method: extend / 2 #60
method: extend_bindings / 1 #71
method: __extend__ / 2 #80

Code

   1  # coding: utf-8
   2  # frozen_string_literal: true
   3 
   4 
   5 
   6  module Umu
   7 
   8  module Environment
   9 
  10  module Context
  11 
  12  module Value
  13 
  14  class Abstract < Abstraction::Collection
  15      def each
  16          context = self
  17          until context.kind_of?(Initial)
  18 
  19              yield context
  20 
  21              context = context.old_context
  22          end
  23 
  24          nil
  25      end
  26 
  27 
  28      def get_bindings
  29          {}.freeze
  30      end
  31 
  32 
  33      def lookup(sym, loc, env)
  34          ASSERT.kind_of sym, ::Symbol
  35          ASSERT.kind_of loc, LOC::Entry
  36          ASSERT.kind_of env, E::Entry
  37 
  38          self.each do |context|
  39              ASSERT.kind_of context, Entry
  40 
  41              target = context.bindings[sym]
  42              ASSERT.opt_kind_of target, Target::Abstract
  43 
  44              if target
  45                  got_value = target.get_value(context)
  46                  ASSERT.kind_of got_value, VC::Top
  47 
  48                  return got_value
  49              end
  50          end
  51 
  52          raise X::NameError.new(
  53              loc,
  54              env,
  55              "Unbound value identifier: '%s'", sym.to_s
  56          )
  57      end
  58 
  59 
  60      def extend(sym, target)
  61          ASSERT.kind_of sym,     ::Symbol
  62          ASSERT.kind_of target,  Target::Abstract
  63 
  64          pair = __extend__ sym, target
  65          ASSERT.tuple_of pair, [::Hash, Abstract]
  66 
  67          ECV.make_bindings(*pair)
  68      end
  69 
  70 
  71      def extend_bindings(bindings)
  72          ASSERT.kind_of bindings, ::Hash
  73 
  74          ECV.make_bindings bindings, self
  75      end
  76 
  77 
  78  private
  79 
  80      def __extend__(_sym, _target)
  81          raise X::InternalSubclassResponsibility
  82      end
  83  end
  84 
  85  end # Umu::Environment::Context::Value
  86 
  87  end # Umu::Environment::Context
  88 
  89  end # Umu::Environment
  90 
  91  end # Umu