File: concrete-syntax/core/expression/nary/let.rb

Overview
Module Structure
Class Hierarchy
Code

Overview

Module Structure

  module: <Toplevel Module>
  module: Umu#6
  module: ConcreteSyntax#8
  module: Core#10
  module: Expression#12
has properties
function: make_let / 3 #69
  module: Nary#14
  class: Let#16
inherits from
  Abstract ( Umu::ConcreteSyntax::Core::Expression )
has properties
attribute: decls [R] #17
attribute: expr [R] #17
method: initialize / 3 #20
method: to_s #31
method: pretty_print / 1 #36
method: __desugar__ / 2 #49

Code

   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