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 class Message < Abstract
17 alias message_ident obj
18 attr_reader :opt_recv_class_ident
19
20
21 def initialize(loc, message_ident, opt_recv_class_ident)
22 ASSERT.kind_of message_ident, CSCEU::Identifier::Short
23 ASSERT.opt_kind_of opt_recv_class_ident, CSCEU::Identifier::Short
24
25 super(loc, message_ident)
26
27 @opt_recv_class_ident = opt_recv_class_ident
28 end
29
30
31 def to_s
32 format("&(%s%s)",
33 if self.opt_recv_class_ident
34 format "%s : ", self.opt_recv_class_ident
35 else
36 ''
37 end,
38
39 self.message_ident
40 )
41 end
42
43
44 private
45
46 def __desugar__(_env, _event)
47 ASCE.make_lambda(
48 self.loc,
49
50 [
51 ASCE.make_parameter(
52 self.loc,
53 ASCE.make_identifier(self.loc, :'%x')
54 )
55 ],
56
57 ASCE.make_send(
58 loc,
59
60 ASCE.make_identifier(self.loc, :'%x'),
61
62 ASCE.make_message(
63 self.message_ident.loc,
64 self.message_ident.sym
65 ),
66
67 [],
68
69 if self.opt_recv_class_ident
70 self.opt_recv_class_ident.sym
71 else
72 nil
73 end
74 ),
75
76 self.message_ident.sym
77 )
78 end
79 end
80
81 end # Umu::ConcreteSyntax::Core::Expression::Unary
82
83
84
85 module_function
86
87 def make_functionalized_message(
88 loc, message_ident, opt_recv_class_ident = nil
89 )
90 ASSERT.kind_of loc, LOC::Entry
91 ASSERT.kind_of message_ident, CSCEU::Identifier::Short
92 ASSERT.opt_kind_of opt_recv_class_ident, CSCEU::Identifier::Short
93
94 Unary::Message.new(loc, message_ident, opt_recv_class_ident).freeze
95 end
96
97 end # Umu::ConcreteSyntax::Core::Expression
98
99 end # Umu::ConcreteSyntax::Core
100
101 end # Umu::ConcreteSyntax
102
103 end # Umu