Skip to content
This repository was archived by the owner on Oct 18, 2021. It is now read-only.

Commit 8932cbb

Browse files
authored
Differentiate between user-provided and temporary variables (#178)
Differentiate between user-provided and temporary variables This allows the codegen to make /slightly/ more reasonable (and more importantly, deterministic) code.
1 parent 17086cb commit 8932cbb

36 files changed

+213
-195
lines changed

compiler/Repl.hs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -282,8 +282,8 @@ execString name line = do
282282
vs' <- for vs $ \(v, _) -> do
283283
let Just (_, vs) = VarMap.lookup v (emit' ^. B.topVars)
284284
repr <- traverse (valueRepr . evalExpr . B.unsimple) vs
285-
let CoVar id nam _ = v
286-
var = S.TgName nam id
285+
let CoVar id _ _ = v
286+
var = S.TgName (covarDisplayName v) id
287287
case inferScope state' ^. T.names . at var of
288288
Just ty -> pure (Just (pretty v <+> colon <+> nest 2 (displayType ty <+> equals </> hsep (map pretty repr))))
289289
Nothing -> pure Nothing

src/Backend/Escape.hs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ pushVar v s = escapeVar (toVar v) where
6363
escapeVar v@(CoVar _ name _) =
6464
case Map.lookup v (toEsc s) of
6565
Just n -> (n, s)
66-
Nothing -> pushFirst Nothing (escape s name)
66+
Nothing -> pushFirst Nothing (escape s (fromMaybe "tmp" name))
6767

6868
pushFirst :: Maybe Int -> T.Text -> (T.Text, EscapeScope)
6969
pushFirst prefix esc =

src/Backend/Lua/Builtin.hs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,6 @@ module Backend.Lua.Builtin
88
, builtinBuilders
99
) where
1010

11-
import Control.Lens
12-
1311
import qualified Data.VarMap as VarMap
1412
import qualified Data.Sequence as Seq
1513
import qualified Data.Text as T
@@ -184,7 +182,7 @@ builtins =
184182

185183
where
186184
genOp (var, op) =
187-
let name = escaper (var ^. covarName)
185+
let name = escaper (covarDisplayName var)
188186
name_ = LuaName name
189187
inner = LuaBinOp (LuaRef left) op (LuaRef right)
190188
in ( var, name, []

src/Backend/Lua/Emit.hs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -168,7 +168,7 @@ toGraph = Graph DirectedGraph
168168

169169
instance IsVar a => Pretty (VarMap.Map (EmittedNode a)) where
170170
pretty = drawGraph disp . toGraph where
171-
disp (CoVar id name _) = text name <> "_" <> int' id
171+
disp v@(CoVar id _ _) = text (covarDisplayName v) <> "_" <> int' id
172172
int' x | x < 0 = "_" <> int (-x)
173173
| otherwise = int x
174174

src/Control/Monad/Infer.hs

Lines changed: 1 addition & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ module Control.Monad.Infer
1717
, Constraint(..)
1818
, Env
1919
, MonadInfer, Name
20-
, lookupTy, lookupTy', genNameFrom, genNameWith, runInfer, freeInEnv
20+
, lookupTy, lookupTy', runInfer, freeInEnv
2121
, difference, freshTV, refreshTV
2222
, instantiate
2323
, SomeReason(..), Reasonable, addBlame
@@ -220,16 +220,6 @@ runInfer :: MonadNamey m
220220
runInfer ct ac = over here toList <$>
221221
runChronicleT (runWriterT (runReaderT ac ct))
222222

223-
genNameFrom :: MonadNamey m => Text -> m (Var Desugared)
224-
genNameFrom t = do
225-
~(TgName _ n) <- genName
226-
pure (TgName t n)
227-
228-
genNameWith :: MonadNamey m => Text -> m (Var Desugared)
229-
genNameWith t = do
230-
~(TgName e n) <- genName
231-
pure (TgName (t <> e) n)
232-
233223
firstName :: Var Desugared
234224
firstName = TgName "a" 0
235225

src/Control/Monad/Namey.hs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ module Control.Monad.Namey
1414
( NameyT, runNameyT, evalNameyT
1515
, Namey, runNamey, evalNamey
1616
, MonadNamey(..)
17+
, genNameFrom, genNameWith
1718
, genAlnum
1819
) where
1920

@@ -150,3 +151,15 @@ genAlnum n = go (fromIntegral n) T.empty (floor (logBase 26 (fromIntegral n :: D
150151
0 -> 1
151152
x -> x
152153
in go (n `mod'` (26 ^ p)) (T.snoc out (chr (96 + m))) (p - 1)
154+
155+
-- | Generate a fresh var with a specific name.
156+
genNameFrom :: MonadNamey m => T.Text -> m (Var Desugared)
157+
genNameFrom t = do
158+
~(TgName _ n) <- genName
159+
pure (TgName t n)
160+
161+
-- | Generate a fresh var prepended with another name.
162+
genNameWith :: MonadNamey m => T.Text -> m (Var Desugared)
163+
genNameWith t = do
164+
~(TgName e n) <- genName
165+
pure (TgName (t <> e) n)

src/Core/Builtin.hs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -283,4 +283,4 @@ fakeKINT =
283283

284284
makeBuiltins :: [ (Text, VarInfo) ] -> [CoVar]
285285
makeBuiltins xs = zipWith go xs [-1, -2 ..] where
286-
go (name, t) id = CoVar id name t
286+
go (name, t) id = CoVar id (Just name) t

src/Core/Lint.hs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -465,7 +465,7 @@ checkNoUnboxed ValuesTy{} = pushError IllegalUnbox
465465
checkNoUnboxed _ = pure ()
466466

467467
unknownVar :: IsVar a => a
468-
unknownVar = fromVar (CoVar (-100) "?" ValueVar)
468+
unknownVar = fromVar (CoVar (-100) (Just "?") ValueVar)
469469

470470
unknownTyvar :: IsVar a => Type a
471471
unknownTyvar = VarTy unknownVar

src/Core/Lower.hs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -188,7 +188,7 @@ lowerAt (ExprWrapper wrap e an) ty =
188188
S.TypeLam (Skolem (TgName _ id) (TgName n _) _ _) k ->
189189
let ty' (ForallTy (Relevant v) _ t) = substituteInType (VarMap.singleton v (VarTy var)) t
190190
ty' x = x
191-
var = CoVar id n TypeVar
191+
var = CoVar id (Just n) TypeVar
192192
in Lam (TypeArgument var (lowerType k)) <$> lowerAtTerm e (ty' ty)
193193
S.TypeLam _ _ -> error "impossible lowerAt TypeLam"
194194
ws S.:> wy -> lowerAt (ExprWrapper ws (ExprWrapper wy e an) an) ty
@@ -414,8 +414,8 @@ lowerLet bs =
414414
patternExtract pos p test ty outerTy (var, (_, innerTy)) = do
415415
let var' = mkVal var
416416
innerTy' = lowerType innerTy
417-
pvar@(CoVar vn vt _) <- freshFrom var'
418-
let p' = stripPtrn var (TgName vt vn) p
417+
pvar@(CoVar vn _ _) <- freshFrom var'
418+
let p' = stripPtrn var (TgName (covarDisplayName pvar) vn) p
419419

420420
-- Generate `let x = match test with | ... x' ... -> x`
421421
One . (var', outerTy, ) <$> patternWrap pos p' test ty outerTy (Atom (Ref pvar innerTy')) innerTy'

src/Core/Lower/Basic.hs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ mkCon = mkVar DataConVar
4848

4949
-- | Make a core variable from a "Syntax" variable and a given kind.
5050
mkVar :: VarInfo -> Var Resolved -> CoVar
51-
mkVar k (TgName t i) = CoVar i t k
51+
mkVar k (TgName n i) = CoVar i (Just n) k
5252
mkVar _ n@TgInternal{} = error ("Cannot convert " ++ show n ++ " to CoVar")
5353

5454
-- | Lower a type from "Syntax" to one in "Core.Core".
@@ -77,7 +77,7 @@ lowerType (S.TyCon v)
7777
| v == Bi.tyConstraintName = StarTy
7878
| otherwise = ConTy (mkType v)
7979
lowerType (S.TyPromotedCon v) = ConTy (mkCon v) -- TODO this is in the wrong scope
80-
lowerType (S.TySkol (Skolem (TgName _ v) (TgName n _) _ _)) = VarTy (CoVar v n TypeVar)
80+
lowerType (S.TySkol (Skolem (TgName _ v) (TgName n _) _ _)) = VarTy (CoVar v (Just n) TypeVar)
8181
lowerType (S.TySkol _) = error "impossible lowerType TySkol"
8282
lowerType (S.TyOperator l o r)
8383
| o == Bi.tyTupleName = lowerType (S.TyTuple l r)

0 commit comments

Comments
 (0)