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 Nary # N-ary, where N >= 3
15
16 class Let < Expression::Abstract
17 attr_reader :decls, :expr
18
19
20 def initialize(loc, decls, expr)
21 ASSERT.kind_of decls, CSCD::SeqOfDeclaration
22 ASSERT.kind_of expr, CSCE::Abstract
23
24 super(loc)
25
26 @decls = decls
27 @expr = expr
28 end
29
30
31 def to_s
32 format "%%LET { %s %%IN %s }", self.decls.to_s, self.expr.to_s
33 end
34
35
36 def pretty_print(q)
37 PRT.group_for_enum q, self.decls, bb:'%LET {', sep:' '
38
39 q.breakable
40
41 PRT.group q, bb:'%IN', eb:'}', sep:' ' do
42 q.pp self.expr
43 end
44 end
45
46
47 private
48
49 def __desugar__(env, event)
50 new_env = env.enter event
51
52 if self.decls.empty?
53 self.expr.desugar(new_env)
54 else
55 ASCE.make_let(
56 self.loc,
57 self.decls.desugar(new_env),
58 self.expr.desugar(new_env)
59 )
60 end
61 end
62 end
63
64 end # Umu::ConcreteSyntax::Core::Expression::Nary
65
66
67 module_function
68
69 def make_let(loc, decls, expr)
70 ASSERT.kind_of loc, LOC::Entry
71 ASSERT.kind_of decls, CSCD::SeqOfDeclaration
72 ASSERT.kind_of expr, CSCE::Abstract
73
74 Nary::Let.new(loc, decls.freeze, expr).freeze
75 end
76
77 end # Umu::ConcreteSyntax::Core::Expression
78
79 end # Umu::ConcreteSyntax::Core
80
81 end # Umu::ConcreteSyntax
82
83 end # Umu