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 Unary
15
16 module Container
17
18 class Struct < Abstraction::Abstract
19 alias expr_by_sym enum
20
21
22 def initialize(loc, expr_by_sym)
23 ASSERT.kind_of expr_by_sym, ::Hash
24
25 super
26 end
27
28
29 def each
30 self.expr_by_sym.each do |sym, expr|
31 ASSERT.kind_of sym, ::Symbol
32 ASSERT.kind_of expr, ASCE::Abstract
33
34 yield sym, expr
35 end
36 end
37
38
39 def to_s
40 format "%%STRUCT {%s}", self.map { |sym, _| sym.to_s }.join(', ')
41 end
42
43
44 def pretty_print(q)
45 PRT.group_for_enum q, self, bb:'%STRUCT {', eb:'}', join:', ' do
46 |sym, _expr|
47
48 q.text sym.to_s
49 end
50 end
51
52
53 private
54
55 def __evaluate__(env, event)
56 ASSERT.kind_of env, E::Entry
57 ASSERT.kind_of event, E::Tracer::Event
58
59 new_env = env.enter event
60
61 VC.make_struct(
62 self.inject({}) { |hash, (sym, expr)|
63 hash.merge(sym => expr.evaluate(new_env).value) {
64 |lab, _, _|
65
66 ASSERT.abort(lab.to_s)
67 }
68 }
69 )
70 end
71 end
72
73 end # Umu::AbstractSyntax::Core::Expression::Unary::Container
74
75 end # Umu::AbstractSyntax::Core::Expression::Unary
76
77
78 module_function
79
80 def make_struct(loc, expr_by_sym)
81 ASSERT.kind_of loc, LOC::Entry
82 ASSERT.kind_of expr_by_sym, ::Hash
83
84 Unary::Container::Struct.new(loc, expr_by_sym.freeze).freeze
85 end
86
87 end # Umu::AbstractSyntax::Core::Expression
88
89 end # Umu::AbstractSyntax::Core
90
91 end # Umu::AbstractSyntax
92
93 end # Umu