diff options
| author | aarneranta <aarne@chalmers.se> | 2024-03-01 09:17:08 +0100 |
|---|---|---|
| committer | aarneranta <aarne@chalmers.se> | 2024-03-01 09:17:08 +0100 |
| commit | 7e707508a72ce73d6c3e4b8881df37597f5b8801 (patch) | |
| tree | f3ad14683b9ccfe9c660447d902652a49b6f0047 /src/runtime/haskell | |
| parent | c2182274df0a0f730b4d4a41ea4a537cdb388ecd (diff) | |
showExpr and linearize now refresh the printed variables if needed
Diffstat (limited to 'src/runtime/haskell')
| -rw-r--r-- | src/runtime/haskell/PGF/Expr.hs | 17 | ||||
| -rw-r--r-- | src/runtime/haskell/PGF/Linearize.hs | 2 |
2 files changed, 15 insertions, 4 deletions
diff --git a/src/runtime/haskell/PGF/Expr.hs b/src/runtime/haskell/PGF/Expr.hs index d015f18e0..ff1114235 100644 --- a/src/runtime/haskell/PGF/Expr.hs +++ b/src/runtime/haskell/PGF/Expr.hs @@ -17,7 +17,8 @@ module PGF.Expr(Tree, BindType(..), Expr(..), Literal(..), Patt(..), Equation(.. MetaId,
-- helpers
- pMeta,pArg,pLit,freshName,ppMeta,ppLit,ppParens
+ pMeta,pArg,pLit,freshName,ppMeta,ppLit,ppParens,
+ freshBoundVars
) where
import PGF.CId
@@ -235,10 +236,11 @@ pLit = liftM LStr (RP.readS_to_P reads) ppExpr :: Int -> [CId] -> Expr -> PP.Doc
ppExpr d scope (EAbs b x e) = let (bs,xs,e1) = getVars [] [] (EAbs b x e)
+ xs' = freshBoundVars scope xs
in ppParens (d > 1) (PP.char '\\' PP.<>
- PP.hsep (PP.punctuate PP.comma (reverse (List.zipWith ppBind bs xs))) PP.<+>
+ PP.hsep (PP.punctuate PP.comma (reverse (List.zipWith ppBind bs xs'))) PP.<+>
PP.text "->" PP.<+>
- ppExpr 1 (xs++scope) e1)
+ ppExpr 1 (xs' ++ scope) e1)
where
getVars bs xs (EAbs b x e) = getVars (b:bs) ((freshName x xs):xs) e
getVars bs xs e = (bs,xs,e)
@@ -289,6 +291,15 @@ freshName x xs0 = loop 1 x | elem y xs = loop (i+1) (mkCId (show x++show i))
| otherwise = y
+-- refresh new vars xs in scope if needed. AR 2024-03-01
+freshBoundVars :: [CId] -> [CId] -> [CId]
+freshBoundVars scope xs = foldr fresh [] xs
+ where
+ fresh x xs' = mkCId (freshName (showCId x) xs') : xs'
+ freshName s xs' =
+ if elem (mkCId s) (xs' ++ scope)
+ then freshName (s ++ "'") xs'
+ else s
-----------------------------------------------------
-- Computation
diff --git a/src/runtime/haskell/PGF/Linearize.hs b/src/runtime/haskell/PGF/Linearize.hs index 5fdb186c1..a508f3dbc 100644 --- a/src/runtime/haskell/PGF/Linearize.hs +++ b/src/runtime/haskell/PGF/Linearize.hs @@ -81,7 +81,7 @@ linTree pgf cnc e = nub (map snd (lin Nothing 0 e [] [] e [])) where lp = lproductions cnc - lin mb_cty n_fid e0 ys xs (EAbs _ x e) es = lin mb_cty n_fid e0 ys (x:xs) e es + lin mb_cty n_fid e0 ys xs (EAbs _ x e) es = lin mb_cty n_fid e0 ys (freshBoundVars (xs ++ ys) [x] ++ xs) e es --fresh: AR 2024 lin mb_cty n_fid e0 ys xs (EApp e1 e2) es = lin mb_cty n_fid e0 ys xs e1 (e2:es) lin mb_cty n_fid e0 ys xs (EImplArg e) es = lin mb_cty n_fid e0 ys xs e es lin mb_cty n_fid e0 ys xs (ETyped e _) es = lin mb_cty n_fid e0 ys xs e es |
