File: abstract-syntax/core/expression/binary/pipe.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_pipe / 4 #99
  module: Binary#14
  class: Pipe#16
inherits from
  Abstract ( Umu::AbstractSyntax::Core::Expression::Binary )
has properties
alias: opnd_expr lhs_expr #17
alias: opr_head_expr rhs #18
attribute: opr_tail_exprs [R] #19
method: initialize / 4 #22
method: opr_exprs #33
method: to_s #38
method: pretty_print / 1 #46
method: __evaluate__ / 2 #63

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 Binary
  15 
  16  class Pipe < Binary::Abstract
  17      alias       opnd_expr      lhs_expr
  18      alias       opr_head_expr  rhs
  19      attr_reader :opr_tail_exprs
  20 
  21 
  22      def initialize(loc, opnd_expr, opr_head_expr, opr_tail_exprs)
  23          ASSERT.kind_of opnd_expr,       ASCE::Abstract
  24          ASSERT.kind_of opr_head_expr,   ASCE::Abstract
  25          ASSERT.kind_of opr_tail_exprs,  ::Array
  26 
  27          super(loc, opnd_expr, opr_head_expr)
  28 
  29          @opr_tail_exprs = opr_tail_exprs
  30      end
  31 
  32 
  33      def opr_exprs
  34          [self.opr_head_expr] + self.opr_tail_exprs
  35      end
  36 
  37 
  38      def to_s
  39          format("(%s |> %s)",
  40                  self.opnd_expr,
  41                  self.opr_exprs.map(&:to_s).join(' |> ')
  42          )
  43      end
  44 
  45 
  46      def pretty_print(q)
  47          q.text '('
  48          q.pp self.opnd_expr
  49 
  50          self.opr_exprs.each do |expr|
  51              q.breakable
  52 
  53              q.text '|> '
  54              q.pp expr
  55          end
  56 
  57          q.text ')'
  58      end
  59 
  60 
  61  private
  62 
  63      def __evaluate__(env, event)
  64          ASSERT.kind_of env,     E::Entry
  65          ASSERT.kind_of event,   E::Tracer::Event
  66 
  67          new_env = env.enter event
  68 
  69          init_opnd_value = self.opnd_expr.evaluate(new_env).value
  70          ASSERT.kind_of init_opnd_value, VC::Top
  71 
  72          opr_values = self.opr_exprs.map { |expr|
  73              ASSERT.kind_of expr, ASCE::Abstract
  74 
  75              result = expr.evaluate new_env
  76              ASSERT.kind_of result, ASR::Value
  77 
  78              result.value
  79          }
  80 
  81          value = opr_values.inject(init_opnd_value) { |opnd_value, opr_value|
  82              ASSERT.kind_of opnd_value, VC::Top
  83              ASSERT.kind_of opr_value,  VC::Top
  84 
  85              opr_value.apply(
  86                  opnd_value, [], self.loc, new_env
  87              )
  88          }
  89 
  90          ASSERT.kind_of value, VC::Top
  91      end
  92  end
  93 
  94  end # Umu::AbstractSyntax::Core::Expression::Binary
  95 
  96 
  97  module_function
  98 
  99      def make_pipe(loc, opnd_expr, opr_head_expr, opr_tail_exprs = [])
 100          ASSERT.kind_of loc,             LOC::Entry
 101          ASSERT.kind_of opnd_expr,       ASCE::Abstract
 102          ASSERT.kind_of opr_head_expr,   ASCE::Abstract
 103          ASSERT.kind_of opr_tail_exprs,  ::Array
 104 
 105          Binary::Pipe.new(
 106              loc, opnd_expr, opr_head_expr, opr_tail_exprs.freeze
 107          ).freeze
 108      end
 109 
 110  end # Umu::AbstractSyntax::Core::Expression
 111 
 112  end # Umu::AbstractSyntax::Core
 113 
 114  end # Umu::AbstractSyntax
 115 
 116  end # Umu