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 Expression
13
14 module Unary
15
16 module Container
17
18 class Sequential < Abstract
19 def initialize(loc, exprs)
20 ASSERT.kind_of exprs, ::Array
21
22 super
23 end
24
25
26 def to_s
27 format "%%DO (%s)", self.map { |expr| '!' + expr.to_s }.join(' ')
28 end
29
30
31 def pretty_print(q)
32 PRT.group_for_enum q, self, bb:'%DO (', eb:')', join:' ' do
33 |expr|
34 q.text '!'
35 expr.pretty_print q
36 end
37 end
38
39
40 private
41
42 def __desugar__(env, event)
43 new_env = env.enter event
44
45 expr = case self.exprs.size
46 when 0
47 ASCE.make_unit self.loc
48 when 1
49 self.exprs[0].desugar new_env
50 else
51 *not_last_exprs, last_expr = self.exprs
52
53 decls = ASCD.make_seq_of_declaration(
54 self.loc,
55
56 not_last_exprs.map { |expr|
57 ASSERT.kind_of expr, CSCE::Abstract
58
59 ASCD.make_value(
60 expr.loc, WILDCARD, expr.desugar(new_env)
61 )
62 }
63 )
64
65 ASCE.make_let(
66 self.loc, decls, last_expr.desugar(new_env)
67 )
68 end
69
70 ASSERT.kind_of expr, ASCE::Abstract
71 end
72 end
73
74 end # Umu::ConcreteSyntax::Core::Expression::Unary::Container
75
76 end # Umu::ConcreteSyntax::Core::Expression::Unary
77
78
79 module_function
80
81 def make_sequential (loc, exprs)
82 ASSERT.kind_of loc, LOC::Entry
83 ASSERT.kind_of exprs, ::Array
84
85 Unary::Container::Sequential.new(loc, exprs.freeze).freeze
86 end
87
88
89 end # Umu::ConcreteSyntax::Core::Expression
90
91 end # Umu::ConcreteSyntax::Core
92
93 end # Umu::ConcreteSyntax
94
95 end # Umu