@@ -635,9 +635,6 @@ makeBlockFromDecls ab = liftEnvReaderM $ refreshAbs ab \decls result -> do
635635 return $ Block (BlockAnn ty' effs') decls result
636636{-# INLINE makeBlockFromDecls #-}
637637
638- nullaryAtomicCoreLam :: EnvReader m => CAtom n -> m n (CoreLamExpr n )
639- nullaryAtomicCoreLam = undefined
640-
641638coreLamExpr :: EnvReader m => AppExplicitness
642639 -> Abs (Nest (WithExpl CBinder )) (PairE (EffectRow CoreIR ) CBlock ) n
643640 -> m n (CoreLamExpr n )
@@ -1458,6 +1455,81 @@ confuseGHCBuilder :: IRRep r => BuilderM r n (DistinctEvidence n)
14581455confuseGHCBuilder = getDistinct
14591456{-# INLINE confuseGHCBuilder #-}
14601457
1458+ -- === Non-emitting expression visitor ===
1459+
1460+ class Visitor m r i o => ExprVisitorNoEmits m r i o | m -> i , m -> o where
1461+ visitExprNoEmits :: Expr r i -> m (Expr r o )
1462+
1463+ type ExprVisitorNoEmits2 m r = forall i o . ExprVisitorNoEmits (m i o ) r i o
1464+
1465+ visitLamNoEmits
1466+ :: (ExprVisitorNoEmits2 m r , IRRep r , AtomSubstReader v m , EnvExtender2 m )
1467+ => LamExpr r i -> m i o (LamExpr r o )
1468+ visitLamNoEmits (LamExpr bs body) =
1469+ visitBinders bs \ bs' -> LamExpr bs' <$> visitBlockNoEmits body
1470+
1471+ visitBlockNoEmits
1472+ :: (ExprVisitorNoEmits2 m r , IRRep r , AtomSubstReader v m , EnvExtender2 m )
1473+ => Block r i -> m i o (Block r o )
1474+ visitBlockNoEmits (Block _ decls result) =
1475+ absToBlockInferringTypes =<< visitDeclsNoEmits decls \ decls' -> do
1476+ Abs decls' <$> visitAtom result
1477+
1478+ visitDeclsNoEmits
1479+ :: (ExprVisitorNoEmits2 m r , IRRep r , AtomSubstReader v m , EnvExtender2 m )
1480+ => Nest (Decl r ) i i'
1481+ -> (forall o' . DExt o o' => Nest (Decl r ) o o' -> m i' o' a )
1482+ -> m i o a
1483+ visitDeclsNoEmits Empty cont = getDistinct >>= \ Distinct -> cont Empty
1484+ visitDeclsNoEmits (Nest (Let b (DeclBinding ann _ expr)) decls) cont = do
1485+ expr' <- visitExprNoEmits expr
1486+ ty <- getType expr'
1487+ withFreshBinder (getNameHint b) ty \ (b':> _) -> do
1488+ let decl' = Let b' $ DeclBinding ann ty expr'
1489+ extendRenamer (b@> binderName b') do
1490+ visitDeclsNoEmits decls \ decls' ->
1491+ cont $ Nest decl' decls'
1492+
1493+ -- === Emitting expression visitor ===
1494+
1495+ class Visitor m r i o => ExprVisitorEmits m r i o | m -> i , m -> o where
1496+ visitExprEmits :: Emits o => Expr r i -> m (Atom r o )
1497+
1498+ type ExprVisitorEmits2 m r = forall i o . ExprVisitorEmits (m i o ) r i o
1499+
1500+ liftAtomSubstBuilder :: forall tag r m n a . (IRRep r , EnvReader m ) => AtomSubstBuilder tag r n n a -> m n a
1501+ liftAtomSubstBuilder cont = liftBuilder $ runSubstReaderT idSubst $ runAtomSubstBuilder cont
1502+
1503+ -- The phantom type `v` is for defining `Visitor` instances. The pattern is to
1504+ -- define a new singleton type, like `data MyTag = MyTag`.
1505+ newtype AtomSubstBuilder v r i o a =
1506+ AtomSubstBuilder { runAtomSubstBuilder :: SubstReaderT AtomSubstVal (BuilderM r ) i o a }
1507+ deriving (MonadFail , Fallible , Functor , Applicative , Monad , ScopeReader ,
1508+ EnvReader , EnvExtender , Builder r, SubstReader AtomSubstVal ,
1509+ ScopableBuilder r)
1510+
1511+ visitLamEmits
1512+ :: (ExprVisitorEmits2 m r , IRRep r , SubstReader AtomSubstVal m , ScopableBuilder2 r m )
1513+ => LamExpr r i -> m i o (LamExpr r o )
1514+ visitLamEmits (LamExpr bs body) = visitBinders bs \ bs' -> LamExpr bs' <$>
1515+ buildBlock (visitBlockEmits body)
1516+
1517+ visitBlockEmits
1518+ :: (ExprVisitorEmits2 m r , SubstReader AtomSubstVal m , EnvExtender2 m , IRRep r , Emits o )
1519+ => Block r i -> m i o (Atom r o )
1520+ visitBlockEmits (Block _ decls result) = visitDeclsEmits decls $ visitAtom result
1521+
1522+ visitDeclsEmits
1523+ :: (ExprVisitorEmits2 m r , SubstReader AtomSubstVal m , EnvExtender2 m , IRRep r , Emits o )
1524+ => Nest (Decl r ) i i'
1525+ -> m i' o a
1526+ -> m i o a
1527+ visitDeclsEmits Empty cont = cont
1528+ visitDeclsEmits (Nest (Let b (DeclBinding _ _ expr)) decls) cont = do
1529+ x <- visitExprEmits expr
1530+ extendSubst (b@> SubstVal x) do
1531+ visitDeclsEmits decls cont
1532+
14611533-- === Helpers for function evaluation over fixed-width types ===
14621534
14631535applyIntBinOp' :: (forall a . (Eq a , Ord a , Num a , Integral a )
0 commit comments