File: concrete-syntax/core/pattern/elem-of-container.rb

Overview
Module Structure
Class Hierarchy
Code

Overview

Module Structure

  module: <Toplevel Module>
  module: Umu#6
  module: ConcreteSyntax#8
  module: Core#10
  module: Pattern#12
has properties
function: make_variable / 3 #133
function: make_named_tuple_field / 3 #141
  module: ElementOfContainer#14
  class: Abstract#16
inherits from
  Abstract ( Umu::ConcreteSyntax::Core::Pattern )
has properties
method: var_pat #17
method: hash #22
method: eql? / 1 #27
method: wildcard? #32
method: exported_vars #37
  class: Variable#50
inherits from
  Abstract ( Umu::ConcreteSyntax::Core::Pattern::ElementOfContainer )
has properties
attribute: var_sym [R] #51
attribute: opt_type_sym [R] #51
method: initialize / 3 #54
method: to_s #65
method: var_pat #78
method: __desugar_value__ / 3 #85
method: __desugar_lambda__ / 3 #92
  class: Field#103
inherits from
  Abstract ( Umu::ConcreteSyntax::Core::Pattern::ElementOfContainer )
has properties
attribute: label [R] #104
attribute: var_pat [R] #104
method: initialize / 3 #107
method: opt_type_sym #118
method: to_s #123

Code

   1  # coding: utf-8
   2  # frozen_string_literal: true
   3 
   4 
   5 
   6  module Umu
   7 
   8  module ConcreteSyntax
   9 
  10  module Core
  11 
  12  module Pattern
  13 
  14  module ElementOfContainer
  15 
  16  class Abstract < Pattern::Abstract
  17      def var_pat
  18          raise X::InternalSubclassResponsibility
  19      end
  20 
  21 
  22      def hash
  23          self.var_pat.var_sym.hash
  24      end
  25 
  26 
  27      def eql?(other)
  28          self.var_pat.var_sym.eql? other.var_pat.var_sym
  29      end
  30 
  31 
  32      def wildcard?
  33          self.var_pat.var_sym == WILDCARD
  34      end
  35 
  36 
  37      def exported_vars
  38          (
  39              if self.wildcard?
  40                  []
  41              else
  42                  [self]
  43              end
  44          ).freeze
  45      end
  46  end
  47 
  48 
  49 
  50  class Variable < Abstract
  51      attr_reader :var_sym, :opt_type_sym
  52 
  53 
  54      def initialize(loc, var_sym, opt_type_sym)
  55          ASSERT.kind_of      var_sym,        ::Symbol
  56          ASSERT.opt_kind_of  opt_type_sym,   ::Symbol
  57 
  58          super(loc)
  59 
  60          @var_sym        = var_sym
  61          @opt_type_sym   = opt_type_sym
  62      end
  63 
  64 
  65      def to_s
  66          format("%s%s",
  67              self.var_sym.to_s,
  68 
  69              if self.opt_type_sym
  70                  format " : %s", self.opt_type_sym.to_s
  71              else
  72                  ''
  73              end
  74          )
  75      end
  76 
  77 
  78      def var_pat
  79          self
  80      end
  81 
  82 
  83  private
  84 
  85      def __desugar_value__(expr, _env, _event)
  86          ASSERT.kind_of expr, ASCE::Abstract
  87 
  88          ASCD.make_value self.loc, self.var_sym, expr, self.opt_type_sym
  89      end
  90 
  91 
  92      def __desugar_lambda__(_seq_num, _env, _event)
  93          CSCP.make_result(
  94              ASCE.make_identifier(self.loc, self.var_sym),
  95              [],
  96              self.opt_type_sym
  97          )
  98      end
  99  end
 100 
 101 
 102 
 103  class Field < Abstract
 104      attr_reader :label, :var_pat
 105 
 106 
 107      def initialize(loc, label, var_pat)
 108          ASSERT.kind_of label,    Container::Product::Named::Label
 109          ASSERT.kind_of var_pat,  ElementOfContainer::Variable
 110 
 111          super(loc)
 112 
 113          @label   = label
 114          @var_pat = var_pat
 115      end
 116 
 117 
 118      def opt_type_sym
 119          self.var_pat.opt_type_sym
 120      end
 121 
 122 
 123      def to_s
 124          self.label.to_s + self.var_pat.to_s
 125      end
 126  end
 127 
 128  end # Umu::ConcreteSyntax::Core::Pattern::ElementOfContainer
 129 
 130 
 131  module_function
 132 
 133      def make_variable(loc, var_sym, opt_type_sym = nil)
 134          ASSERT.kind_of loc,     LOC::Entry
 135          ASSERT.kind_of      var_sym,        ::Symbol
 136          ASSERT.opt_kind_of  opt_type_sym,   ::Symbol
 137 
 138          ElementOfContainer::Variable.new(loc, var_sym, opt_type_sym).freeze
 139      end
 140 
 141      def make_named_tuple_field(loc, label, var_pat)
 142          ASSERT.kind_of loc,     LOC::Entry
 143          ASSERT.kind_of label,   Container::Product::Named::Label
 144          ASSERT.kind_of var_pat, ElementOfContainer::Variable
 145 
 146          ElementOfContainer::Field.new(loc, label, var_pat).freeze
 147      end
 148 
 149 
 150  end # Umu::ConcreteSyntax::Core::Pattern
 151 
 152  end # Umu::ConcreteSyntax::Core
 153 
 154  end # Umu::ConcreteSyntax
 155 
 156  end # Umu