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 Prefix < Unary::Abstract
17 alias sym obj
18 attr_reader :rhs_expr
19
20
21 def initialize(loc, sym, rhs_expr)
22 ASSERT.kind_of sym, ::Symbol
23 ASSERT.kind_of rhs_expr, CSCE::Abstract
24
25 super(loc, sym)
26
27 @rhs_expr = rhs_expr
28 end
29
30
31 def to_s
32 format "(%s %s)", self.sym, self.rhs_expr.to_s
33 end
34
35
36 private
37
38 def __desugar__(env, event)
39 ASCE.make_lambda(
40 self.loc,
41
42 [
43 ASCE.make_parameter(
44 self.loc,
45 ASCE.make_identifier(self.loc, :'%x')
46 )
47 ],
48
49 ASCE.make_apply(
50 self.loc,
51 ASCE.make_identifier(self.loc, self.sym),
52 ASCE.make_identifier(self.loc, :'%x'),
53 [self.rhs_expr.desugar(env.enter(event))]
54 ),
55
56 self.sym
57 )
58 end
59 end
60
61 end # Umu::ConcreteSyntax::Core::Expression::Unary
62
63
64
65 module_function
66
67 def make_prefix(loc, sym, rhs_expr)
68 ASSERT.kind_of loc, LOC::Entry
69 ASSERT.kind_of sym, ::Symbol
70 ASSERT.kind_of rhs_expr, CSCE::Abstract
71
72 Unary::Prefix.new(loc, sym, rhs_expr).freeze
73 end
74
75 end # Umu::ConcreteSyntax::Core::Expression
76
77 end # Umu::ConcreteSyntax::Core
78
79 end # Umu::ConcreteSyntax
80
81 end # Umu