Skip to content

Commit

Permalink
fix de Bruijn indices in rmap
Browse files Browse the repository at this point in the history
  • Loading branch information
lukaszcz authored and janmasrovira committed Mar 17, 2023
1 parent 3dac3c8 commit 12dc9a2
Show file tree
Hide file tree
Showing 2 changed files with 48 additions and 31 deletions.
64 changes: 33 additions & 31 deletions src/Juvix/Compiler/Core/Extra/Recursors/RMap.hs
Original file line number Diff line number Diff line change
Expand Up @@ -66,37 +66,39 @@ rmapG coll f = go mempty 0 (coll ^. cEmpty)
go binders bl c n = f recur c n
where
recur :: c -> [BinderChange] -> Node -> m Node
recur c' changes = \case
NVar v ->
return $
maybe
(NVar v {_varIndex = getBinderIndex bl lvl})
(shift (bl - lvl))
mnode
where
(lvl, mnode) = BL.lookup (v ^. varIndex) binders
n' ->
let ni = destruct n'
in reassembleDetails ni <$> mapM goChild (ni ^. nodeChildren)
where
goChild :: NodeChild -> m Node
goChild ch =
let (bl', rbs, rbs') =
foldl'
( \(l, bs, acc) chg -> case chg of
BCAdd k -> (l + k, bs, acc)
BCKeep b -> (l + 1, b : bs, (l, Nothing) : acc)
BCRemove (BinderRemove b node) -> (l, b : bs, (l, Just node) : acc)
)
(bl, [], [])
changes
cbs = map (\l -> (l, Nothing)) [bl' .. bl' + ch ^. childBindersNum - 1]
binders' = BL.prependRev cbs (BL.prepend rbs' binders)
in go
binders'
(bl' + ch ^. childBindersNum)
((coll ^. cCollect) (length rbs + ch ^. childBindersNum, reverse rbs ++ ch ^. childBinders) c')
(ch ^. childNode)
recur c' changes =
let (bl', rbs, rbs') =
foldl'
( \(l, bs, acc) chg -> case chg of
BCAdd k -> (l + k, bs, acc)
BCKeep b -> (l + 1, b : bs, (l, Nothing) : acc)
BCRemove (BinderRemove b node) -> (l, b : bs, (l, Just node) : acc)
)
(bl, [], [])
changes
binders' = BL.prepend rbs' binders
in \case
NVar v ->
return $
maybe
(NVar v {_varIndex = getBinderIndex bl' lvl})
(shift (bl' - lvl))
mnode
where
(lvl, mnode) = BL.lookup (v ^. varIndex) binders'
n' ->
let ni = destruct n'
in reassembleDetails ni <$> mapM goChild (ni ^. nodeChildren)
where
goChild :: NodeChild -> m Node
goChild ch =
let cbs = map (\l -> (l, Nothing)) [bl' .. bl' + ch ^. childBindersNum - 1]
binders'' = BL.prependRev cbs binders'
in go
binders''
(bl' + ch ^. childBindersNum)
((coll ^. cCollect) (length rbs + ch ^. childBindersNum, reverse rbs ++ ch ^. childBinders) c')
(ch ^. childNode)

rmapEmbedIden :: ((([BinderChange] -> Node -> Node) -> Node -> Node)) -> (([BinderChange] -> Node -> Identity Node) -> Node -> Identity Node)
rmapEmbedIden f recur = return . f (\bcs -> runIdentity . recur bcs)
Expand Down
15 changes: 15 additions & 0 deletions test/Core/Recursor/RMap.hs
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,9 @@ tests =
addLambdas
[ ( mkLambdas' [mkTypeInteger', mkTypeInteger'] (mkBuiltinApp' OpIntAdd [mkVar' 1, mkVar' 0]),
mkLambdas' [mkDynamic', mkTypeInteger', mkDynamic', mkTypeInteger'] (mkBuiltinApp' OpIntAdd [mkVar' 2, mkVar' 0])
),
( mkLambdas' [mkTypeInteger', mkTypeInteger'] (mkVar' 1),
mkLambdas' [mkDynamic', mkTypeInteger', mkDynamic', mkTypeInteger'] (mkVar' 2)
)
],
UnitTest
Expand All @@ -38,13 +41,25 @@ tests =
),
( mkLambda' mkTypeInteger' $ mkLet' mkTypeInteger' (mkVar' 0) $ mkLambda' mkTypeInteger' $ mkBuiltinApp' OpIntAdd [mkVar' 2, mkVar' 0],
mkLets' [(mkTypeInteger', mkConstant' (ConstInteger 0)), (mkTypeInteger', mkVar' 0), (mkTypeInteger', mkConstant' (ConstInteger 2))] (mkBuiltinApp' OpIntAdd [mkVar' 2, mkVar' 0])
),
( mkLambda' mkTypeInteger' $ mkVar' 0,
mkLet' mkTypeInteger' (mkConstant' (ConstInteger 0)) (mkVar' 0)
)
],
UnitTest
"Remove lambdas"
removeLambdas
[ ( mkLambdas' [mkTypeInteger', mkTypeInteger', mkTypeInteger', mkTypeInteger'] (mkBuiltinApp' OpIntAdd [mkBuiltinApp' OpIntAdd [mkVar' 3, mkVar' 1], mkVar' 2]),
mkLambdas' [mkTypeInteger', mkTypeInteger'] (mkBuiltinApp' OpIntAdd [mkBuiltinApp' OpIntAdd [mkVar' 1, mkVar' 0], mkVar' 1])
),
( mkLambdas' [mkTypeInteger', mkTypeInteger'] (mkVar' 0),
mkLambda' mkTypeInteger' (mkVar' 0)
),
( mkLambdas' [mkTypeInteger', mkTypeInteger', mkTypeInteger', mkTypeInteger'] (mkVar' 2),
mkLambdas' [mkTypeInteger', mkTypeInteger'] (mkVar' 1)
),
( mkLambdas' [mkTypeInteger', mkTypeInteger', mkTypeInteger'] (mkVar' 1),
mkLambdas' [mkTypeInteger', mkTypeInteger'] (mkVar' 1)
)
]
]
Expand Down

0 comments on commit 12dc9a2

Please sign in to comment.