@@ -626,23 +626,19 @@ class Lowering()(using Config, TL, Raise, State, Ctx):
626
626
def quoteSplit (split : Split )(k : Result => Block )(using Subst ): Block = split match
627
627
case Split .Cons (Branch (scrutinee, pattern, continuation), tail) => quote(scrutinee): r1 =>
628
628
val l1, l2, l3, l4, l5 = new TempSymbol (N )
629
- Assign (l1, r1, quotePattern(pattern): r2 =>
630
- Assign (l2, r2, quoteSplit(continuation): r3 =>
631
- Assign (l3, r3, setupTerm(" Branch" , (l1 :: l2 :: l3 :: Nil ).map(s => Value .Ref (s))): r4 =>
632
- Assign (l4, r4, quoteSplit(tail): r5 =>
633
- Assign (l5, r5, setupTerm(" Cons" , (l4 :: l5 :: Nil ).map(s => Value .Ref (s)))(k))
634
- )
635
- )
636
- )
637
- )
629
+ blockBuilder.assign(l1, r1)
630
+ .chain(b => quotePattern(pattern)(r2 => Assign (l2, r2, b)))
631
+ .chain(b => quoteSplit(continuation)(r3 => Assign (l3, r3, b)))
632
+ .chain(b => setupTerm(" Branch" , (l1 :: l2 :: l3 :: Nil ).map(s => Value .Ref (s)))(r4 => Assign (l4, r4, b)))
633
+ .chain(b => quoteSplit(tail)(r5 => Assign (l5, r5, b)))
634
+ .rest(setupTerm(" Cons" , (l4 :: l5 :: Nil ).map(s => Value .Ref (s)))(k))
638
635
case Split .Let (sym, term, tail) => setupSymbol(sym, true ): r1 =>
639
636
val l1, l2, l3 = new TempSymbol (N )
640
- Assign (l1, r1, setupTerm(" Ref" , Value .Ref (l1) :: Nil ): r =>
641
- Assign (sym, r, quote(term)(r2 =>
642
- Assign (l2, r2, quoteSplit(tail)(r3 =>
643
- Assign (l3, r3, setupTerm(" Let" , (l1 :: l2 :: l3 :: Nil ).map(s => Value .Ref (s)))(k))
644
- )))
645
- ))
637
+ blockBuilder.assign(l1, r1)
638
+ .chain(b => setupTerm(" Ref" , Value .Ref (l1) :: Nil )(r => Assign (sym, r, b)))
639
+ .chain(b => quote(term)(r2 => Assign (l2, r2, b)))
640
+ .chain(b => quoteSplit(tail)(r3 => Assign (l3, r3, b)))
641
+ .rest(setupTerm(" Let" , (l1 :: l2 :: l3 :: Nil ).map(s => Value .Ref (s)))(k))
646
642
case Split .Else (default) => quote(default): r =>
647
643
val l = new TempSymbol (N )
648
644
Assign (l, r, setupTerm(" Else" , Value .Ref (l) :: Nil )(k))
@@ -705,18 +701,16 @@ class Lowering()(using Config, TL, Raise, State, Ctx):
705
701
rec(rhs, Nil )(k)
706
702
case Blk (LetDecl (sym, _) :: DefineVar (sym2, rhs) :: Nil , res) => // Let bindings
707
703
require(sym2 is sym)
708
- setupSymbol(sym, true ): r1 =>
704
+ setupSymbol(sym, true ){ r1 =>
709
705
val l1, l2, l3, l4, l5 = new TempSymbol (N )
710
- Assign (l1, r1, setupTerm(" Ref" , Value .Ref (l1) :: Nil ): r =>
711
- Assign (sym, r, quote(rhs)(r2 =>
712
- Assign (l2, r2, quote(res)(r3 =>
713
- Assign (l3, r3, setupTerm(" LetDecl" , Value .Ref (l1) :: Nil )(r4 =>
714
- Assign (l4, r4, setupTerm(" DefineVar" , Value .Ref (l1) :: Value .Ref (l2) :: Nil )(r5 =>
715
- Assign (l5, r5, setupTerm(" Blk" , Value .Arr ((l4 :: l5 :: Nil ).map(s => Value .Ref (s).asArg)) :: Value .Ref (l3) :: Nil )(k))
716
- ))
717
- ))
718
- ))
719
- )))
706
+ blockBuilder.assign(l1, r1)
707
+ .chain(b => setupTerm(" Ref" , Value .Ref (l1) :: Nil )(r => Assign (sym, r, b)))
708
+ .chain(b => quote(rhs)(r2 => Assign (l2, r2, b)))
709
+ .chain(b => quote(res)(r3 => Assign (l3, r3, b)))
710
+ .chain(b => setupTerm(" LetDecl" , Value .Ref (l1) :: Nil )(r4 => Assign (l4, r4, b)))
711
+ .chain(b => setupTerm(" DefineVar" , Value .Ref (l1) :: Value .Ref (l2) :: Nil )(r5 => Assign (l5, r5, b)))
712
+ .rest(setupTerm(" Blk" , Value .Arr ((l4 :: l5 :: Nil ).map(s => Value .Ref (s).asArg)) :: Value .Ref (l3) :: Nil )(k))
713
+ }
720
714
case IfLike (syntax.Keyword .`if`, split) => quoteSplit(split): r =>
721
715
val l = new TempSymbol (N )
722
716
Assign (l, r, setupTerm(" IfLike" , setupQuotedKeyword(" If" ) :: Value .Ref (l) :: Nil )(k))
0 commit comments