File: abstract-syntax/core/expression/unary/container/struct.rb

Overview
Module Structure
Class Hierarchy
Code

Overview

Module Structure

  module: <Toplevel Module>
  module: Umu#6
  module: AbstractSyntax#8
  module: Core#10
  module: Expression#12
has properties
function: make_struct / 2 #80
  module: Unary#14
  module: Container#16
  class: Struct#18
inherits from
  Abstract ( Umu::AbstractSyntax::Core::Expression::Unary::Container::Abstraction )
has properties
alias: expr_by_sym enum #19
method: initialize / 2 #22
method: each #29
method: to_s #39
method: pretty_print / 1 #44
method: __evaluate__ / 2 #55

Code

   1  # coding: utf-8
   2  # frozen_string_literal: true
   3 
   4 
   5 
   6  module Umu
   7 
   8  module AbstractSyntax
   9 
  10  module Core
  11 
  12  module Expression
  13 
  14  module Unary
  15 
  16  module Container
  17 
  18  class Struct < Abstraction::Abstract
  19      alias expr_by_sym enum
  20 
  21 
  22      def initialize(loc, expr_by_sym)
  23          ASSERT.kind_of expr_by_sym, ::Hash
  24 
  25          super
  26      end
  27 
  28 
  29      def each
  30          self.expr_by_sym.each do |sym, expr|
  31              ASSERT.kind_of sym,   ::Symbol
  32              ASSERT.kind_of expr,  ASCE::Abstract
  33 
  34              yield sym, expr
  35          end
  36      end
  37 
  38 
  39      def to_s
  40          format "%%STRUCT {%s}", self.map { |sym, _| sym.to_s }.join(', ')
  41      end
  42 
  43 
  44      def pretty_print(q)
  45          PRT.group_for_enum q, self, bb:'%STRUCT {', eb:'}', join:', ' do
  46              |sym, _expr|
  47 
  48              q.text sym.to_s
  49          end
  50      end
  51 
  52 
  53  private
  54 
  55      def __evaluate__(env, event)
  56          ASSERT.kind_of env,     E::Entry
  57          ASSERT.kind_of event,   E::Tracer::Event
  58 
  59          new_env = env.enter event
  60 
  61          VC.make_struct(
  62              self.inject({}) { |hash, (sym, expr)|
  63                  hash.merge(sym => expr.evaluate(new_env).value) {
  64                      |lab, _, _|
  65 
  66                      ASSERT.abort(lab.to_s)
  67                  }
  68              }
  69          )
  70      end
  71  end
  72 
  73  end # Umu::AbstractSyntax::Core::Expression::Unary::Container
  74 
  75  end # Umu::AbstractSyntax::Core::Expression::Unary
  76 
  77 
  78  module_function
  79 
  80      def make_struct(loc, expr_by_sym)
  81          ASSERT.kind_of loc,           LOC::Entry
  82          ASSERT.kind_of expr_by_sym,   ::Hash
  83 
  84          Unary::Container::Struct.new(loc, expr_by_sym.freeze).freeze
  85      end
  86 
  87  end # Umu::AbstractSyntax::Core::Expression
  88 
  89  end # Umu::AbstractSyntax::Core
  90 
  91  end # Umu::AbstractSyntax
  92 
  93  end # Umu