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