File: value/core/top.rb

Overview
Module Structure
Class Hierarchy
Code

Overview

Module Structure

  module: <Toplevel Module>
  module: Umu#6
  module: Value#8
  module: Core#10
  class: Top#12
inherits from
  Object ( Builtin-Module )
has properties
class method: class_method_infos #13
class method: instance_method_infos #30
class method: define_class_method / 5 #47
class method: define_instance_method / 5 #63
class method: __define_method__ / 6 #79
class method: type_sym (1/2) #111
method: type_sym (2/E) #127
method: pretty_print / 1 #132
method: invoke / 5 #137
method: apply / 4 #184
method: __invoke__ / 5 #200

Class Hierarchy

Object ( Builtin-Module )
  Top ( Umu::Value::Core ) #12

Code

   1  # coding: utf-8
   2  # frozen_string_literal: true
   3 
   4 
   5 
   6  module Umu
   7 
   8  module Value
   9 
  10  module Core
  11 
  12  class Top < ::Object
  13      def self.class_method_infos
  14          infos = @class_method_infos
  15 
  16          (infos ? infos : []).map {
  17              |
  18                  meth_sym, mess_sym,
  19                  param_class_types, ret_class_type
  20              |
  21 
  22              ECTS.make_method_info(
  23                  meth_sym, mess_sym,
  24                  param_class_types, ret_class_type
  25              )
  26          }
  27      end
  28 
  29 
  30      def self.instance_method_infos
  31          infos = @instance_method_infos
  32 
  33          (infos ? infos : []).map {
  34              |
  35                  meth_sym, message_sym,
  36                  param_class_types, ret_class_type
  37              |
  38 
  39              ECTS.make_method_info(
  40                  meth_sym, message_sym,
  41                  param_class_types, ret_class_type
  42              )
  43          }
  44      end
  45 
  46 
  47      def self.define_class_method(
  48          meth_sym, hd_mess_sym, tl_mess_syms,
  49          param_class_types, ret_class_type
  50      )
  51          # printf "CLASS METHOD OF %s\n", self
  52 
  53          @class_method_infos ||= []
  54 
  55          self.__define_method__(
  56              @class_method_infos,
  57              meth_sym, hd_mess_sym, tl_mess_syms,
  58              param_class_types, ret_class_type
  59          )
  60      end
  61 
  62 
  63      def self.define_instance_method(
  64          meth_sym, hd_mess_sym, tl_mess_syms,
  65          param_class_types, ret_class_type
  66      )
  67          # printf "INSTANCE METHOD OF %s\n", self
  68 
  69          @instance_method_infos ||= []
  70 
  71          self.__define_method__(
  72              @instance_method_infos,
  73              meth_sym, hd_mess_sym, tl_mess_syms,
  74              param_class_types, ret_class_type
  75          )
  76      end
  77 
  78 
  79      def self.__define_method__(
  80          infos,
  81          meth_sym, hd_mess_sym, tl_mess_syms,
  82          param_class_types, ret_class_type
  83      )
  84  =begin
  85          pp [
  86              meth_sym, hd_mess_sym, tl_mess_syms,
  87              param_class_types, ret_class_type
  88          ]
  89  =end
  90          ASSERT.kind_of infos,              ::Array
  91          ASSERT.kind_of meth_sym,           ::Symbol
  92          ASSERT.kind_of hd_mess_sym,        ::Symbol
  93          tl_mess_syms.each do |mess_alias_sym|
  94              ASSERT.kind_of mess_alias_sym, ::Symbol
  95          end
  96          ASSERT.kind_of param_class_types,  ::Array
  97          param_class_types.each do |param_class_type|
  98              ASSERT.subclass_of param_class_type, VC::Top
  99          end
 100          ASSERT.subclass_of ret_class_type, VC::Top
 101 
 102          ([hd_mess_sym] + tl_mess_syms).each do |message_sym|
 103              infos << [
 104                      meth_sym, message_sym,
 105                      param_class_types, ret_class_type
 106                  ]
 107          end
 108      end
 109 
 110 
 111      def self.type_sym
 112          begin
 113              self.const_get :TYPE_SYM, false
 114          rescue ::NameError
 115              class_path  = self.to_s.split(/::/).map(&:to_sym)
 116              self_sym    = class_path[-1]
 117 
 118              if self_sym == :Abstract
 119                  class_path[-2]
 120              else
 121                  self_sym
 122              end
 123          end
 124      end
 125 
 126 
 127      def type_sym
 128          self.class.type_sym
 129      end
 130 
 131 
 132      def pretty_print(q)
 133          q.text self.to_s
 134      end
 135 
 136 
 137      def invoke(method_signat, loc, env, _event, *arg_values)
 138          ASSERT.kind_of method_signat,   ECTSM::Entry
 139          ASSERT.kind_of loc,             LOC::Entry
 140          ASSERT.kind_of env,             E::Entry
 141          ASSERT.kind_of arg_values,      ::Array
 142          ASSERT.assert arg_values.all? { |v| v.kind_of? VC::Top }
 143 
 144          msg = format("(%s).%s%s -> %s",
 145                          self.to_s,
 146 
 147                          method_signat.meth_sym,
 148 
 149                          if arg_values.empty?
 150                              ''
 151                          else
 152                              format("(%s)",
 153                                  arg_values.zip(
 154                                      method_signat.param_class_signats
 155                                  ).map{ |(value, signat)|
 156                                      format "%s : %s", value, signat.to_sym
 157                                  }.join(', ')
 158                              )
 159                          end,
 160 
 161                          method_signat.ret_class_signat.to_sym
 162                      )
 163 
 164          value = E::Tracer.trace(
 165                              env.pref,
 166                              env.trace_stack.count,
 167                              'Invoke',
 168                              self.class,
 169                              loc,
 170                              msg,
 171                          ) { |event|
 172                              __invoke__(
 173                                  method_signat.meth_sym,
 174                                  loc,
 175                                  env,
 176                                  event,
 177                                  arg_values
 178                              )
 179                          }
 180          ASSERT.kind_of value, VC::Top
 181      end
 182 
 183 
 184      def apply(_head_value, _tail_values, loc, env)
 185          ASSERT.kind_of loc, LOC::Entry
 186          ASSERT.kind_of env, E::Entry
 187 
 188          raise X::ApplicationError.new(
 189              loc,
 190              env,
 191              "Application error for %s : %s",
 192                  self.to_s,
 193                  self.type_sym.to_s
 194          )
 195      end
 196 
 197 
 198  private
 199 
 200      def __invoke__(meth_sym, loc, env, event, arg_values)
 201          ASSERT.kind_of meth_sym,    ::Symbol
 202          ASSERT.kind_of loc,         LOC::Entry
 203          ASSERT.kind_of env,         E::Entry
 204          ASSERT.kind_of event,       E::Tracer::Event
 205          ASSERT.kind_of arg_values,  ::Array
 206 
 207          self.send meth_sym, loc, env, event, *arg_values
 208      end
 209 
 210  end
 211  Top.freeze
 212 
 213  end # Umu::Value::Core
 214 
 215  end # Umu::Value
 216 
 217  end # Umu