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