Skip to content

Commit 19b9c92

Browse files
committed
Merge branch 'deprecate-generic-traversal'
2 parents 254afaa + 8f74ef0 commit 19b9c92

File tree

11 files changed

+774
-1126
lines changed

11 files changed

+774
-1126
lines changed

dex.cabal

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,6 @@ library
5555
, Core
5656
, Err
5757
, Export
58-
, GenericTraversal
5958
, Generalize
6059
, Imp
6160
, ImpToLLVM

src/lib/Builder.hs

Lines changed: 75 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -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-
641638
coreLamExpr :: 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)
14581455
confuseGHCBuilder = 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

14631535
applyIntBinOp' :: (forall a. (Eq a, Ord a, Num a, Integral a)

0 commit comments

Comments
 (0)