Skip to content
This repository was archived by the owner on Apr 1, 2025. It is now read-only.

Commit 01f1176

Browse files
committed
Split out an Ann datatype representing locations.
1 parent 0f34dce commit 01f1176

File tree

7 files changed

+55
-42
lines changed

7 files changed

+55
-42
lines changed

semantic-core/src/Analysis/Concrete.hs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ newtype FrameId = FrameId { unFrameId :: Precise }
4242
deriving (Eq, Ord, Show)
4343

4444
data Concrete
45-
= Closure Loc User (Term Core.Core User) Env
45+
= Closure Loc User (Term (Core.Ann :+: Core.Core) User) Env
4646
| Unit
4747
| Bool Bool
4848
| String Text
@@ -69,7 +69,7 @@ data Edge = Lexical | Import
6969
--
7070
-- >>> map fileBody (snd (concrete [File (Loc "bool" emptySpan) (Core.bool True)]))
7171
-- [Right (Bool True)]
72-
concrete :: [File (Term Core.Core User)] -> (Heap, [File (Either (Loc, String) Concrete)])
72+
concrete :: [File (Term (Core.Ann :+: Core.Core) User)] -> (Heap, [File (Either (Loc, String) Concrete)])
7373
concrete
7474
= run
7575
. runFresh
@@ -81,7 +81,7 @@ runFile :: ( Carrier sig m
8181
, Member Fresh sig
8282
, Member (State Heap) sig
8383
)
84-
=> File (Term Core.Core User)
84+
=> File (Term (Core.Ann :+: Core.Core) User)
8585
-> m (File (Either (Loc, String) Concrete))
8686
runFile file = traverse run file
8787
where run = runReader (fileLoc file)

semantic-core/src/Analysis/Eval.hs

Lines changed: 17 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
{-# LANGUAGE FlexibleContexts, LambdaCase, OverloadedStrings, RankNTypes, RecordWildCards #-}
1+
{-# LANGUAGE FlexibleContexts, LambdaCase, OverloadedStrings, RankNTypes, RecordWildCards, TypeOperators #-}
22
module Analysis.Eval
33
( eval
44
, prog1
@@ -12,6 +12,7 @@ module Analysis.Eval
1212
) where
1313

1414
import Control.Applicative (Alternative (..))
15+
import Control.Effect.Carrier
1516
import Control.Effect.Fail
1617
import Control.Effect.Reader
1718
import Control.Monad ((>=>))
@@ -33,11 +34,11 @@ eval :: ( Carrier sig m
3334
, Semigroup value
3435
)
3536
=> Analysis address value m
36-
-> (Term Core User -> m value)
37-
-> (Term Core User -> m value)
37+
-> (Term (Ann :+: Core) User -> m value)
38+
-> (Term (Ann :+: Core) User -> m value)
3839
eval Analysis{..} eval = \case
3940
Var n -> lookupEnv' n >>= deref' n
40-
Term c -> case c of
41+
Term (R c) -> case c of
4142
Rec (Named (Ignored n) b) -> do
4243
addr <- alloc n
4344
v <- bind n addr (eval (instantiate1 (pure n) b))
@@ -68,7 +69,7 @@ eval Analysis{..} eval = \case
6869
b' <- eval b
6970
addr <- ref a
7071
b' <$ assign addr b'
71-
Ann loc c -> local (const loc) (eval c)
72+
Term (L (Ann loc c)) -> local (const loc) (eval c)
7273
where freeVariable s = fail ("free variable: " <> s)
7374
uninitialized s = fail ("uninitialized variable: " <> s)
7475
invalidRef s = fail ("invalid ref: " <> s)
@@ -78,41 +79,41 @@ eval Analysis{..} eval = \case
7879

7980
ref = \case
8081
Var n -> lookupEnv' n
81-
Term c -> case c of
82+
Term (R c) -> case c of
8283
If c t e -> do
8384
c' <- eval c >>= asBool
8485
if c' then ref t else ref e
8586
a :. b -> do
8687
a' <- ref a
8788
a' ... b >>= maybe (freeVariable (show b)) pure
88-
Ann loc c -> local (const loc) (ref c)
8989
c -> invalidRef (show c)
90+
Term (L (Ann loc c)) -> local (const loc) (ref c)
9091

9192

92-
prog1 :: File (Term Core User)
93+
prog1 :: File (Term (Ann :+: Core) User)
9394
prog1 = fromBody $ lam (named' "foo")
9495
( named' "bar" :<- pure "foo"
9596
>>>= Core.if' (pure "bar")
9697
(Core.bool False)
9798
(Core.bool True))
9899

99-
prog2 :: File (Term Core User)
100+
prog2 :: File (Term (Ann :+: Core) User)
100101
prog2 = fromBody $ fileBody prog1 $$ Core.bool True
101102

102-
prog3 :: File (Term Core User)
103+
prog3 :: File (Term (Ann :+: Core) User)
103104
prog3 = fromBody $ lams [named' "foo", named' "bar", named' "quux"]
104105
(Core.if' (pure "quux")
105106
(pure "bar")
106107
(pure "foo"))
107108

108-
prog4 :: File (Term Core User)
109+
prog4 :: File (Term (Ann :+: Core) User)
109110
prog4 = fromBody
110111
( named' "foo" :<- Core.bool True
111112
>>>= Core.if' (pure "foo")
112113
(Core.bool True)
113114
(Core.bool False))
114115

115-
prog5 :: File (Term Core User)
116+
prog5 :: File (Term (Ann :+: Core) User)
116117
prog5 = fromBody $ ann (do'
117118
[ Just (named' "mkPoint") :<- lams [named' "_x", named' "_y"] (ann (Core.record
118119
[ ("x", ann (pure "_x"))
@@ -123,7 +124,7 @@ prog5 = fromBody $ ann (do'
123124
, Nothing :<- ann (ann (pure "point") Core.... "y") .= ann (ann (pure "point") Core.... "x")
124125
])
125126

126-
prog6 :: [File (Term Core User)]
127+
prog6 :: [File (Term (Ann :+: Core) User)]
127128
prog6 =
128129
[ File (Loc "dep" (locSpan (fromJust here))) $ Core.record
129130
[ ("dep", Core.record [ ("var", Core.bool True) ]) ]
@@ -133,7 +134,7 @@ prog6 =
133134
])
134135
]
135136

136-
ruby :: File (Term Core User)
137+
ruby :: File (Term (Ann :+: Core) User)
137138
ruby = fromBody $ annWith callStack (rec (named' __semantic_global) (do' statements))
138139
where statements =
139140
[ Just "Class" :<- record
@@ -216,8 +217,8 @@ data Analysis address value m = Analysis
216217
, lookupEnv :: User -> m (Maybe address)
217218
, deref :: address -> m (Maybe value)
218219
, assign :: address -> value -> m ()
219-
, abstract :: (Term Core User -> m value) -> User -> Term Core User -> m value
220-
, apply :: (Term Core User -> m value) -> value -> value -> m value
220+
, abstract :: (Term (Ann :+: Core) User -> m value) -> User -> Term (Ann :+: Core) User -> m value
221+
, apply :: (Term (Ann :+: Core) User -> m value) -> value -> value -> m value
221222
, unit :: m value
222223
, bool :: Bool -> m value
223224
, asBool :: value -> m Bool

semantic-core/src/Analysis/FlowInsensitive.hs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
{-# LANGUAGE FlexibleContexts, OverloadedStrings, ScopedTypeVariables #-}
1+
{-# LANGUAGE FlexibleContexts, OverloadedStrings, ScopedTypeVariables, TypeOperators #-}
22
module Analysis.FlowInsensitive
33
( Heap
44
, FrameId(..)
@@ -20,7 +20,7 @@ import Data.Monoid (Alt(..))
2020
import qualified Data.Set as Set
2121
import Data.Term (Term)
2222

23-
type Cache name a = Map.Map (Term Core.Core name) (Set.Set a)
23+
type Cache name a = Map.Map (Term (Core.Ann :+: Core.Core) name) (Set.Set a)
2424
type Heap name a = Map.Map name (Set.Set a)
2525

2626
newtype FrameId name = FrameId { unFrameId :: name }
@@ -35,8 +35,8 @@ convergeTerm :: forall m sig a name
3535
, Ord a
3636
, Ord name
3737
)
38-
=> (Term Core.Core name -> NonDetC (ReaderC (Cache name a) (StateC (Cache name a) m)) a)
39-
-> Term Core.Core name
38+
=> (Term (Core.Ann :+: Core.Core) name -> NonDetC (ReaderC (Cache name a) (StateC (Cache name a) m)) a)
39+
-> Term (Core.Ann :+: Core.Core) name
4040
-> m (Set.Set a)
4141
convergeTerm eval body = do
4242
heap <- get
@@ -53,8 +53,8 @@ cacheTerm :: forall m sig a name
5353
, Ord a
5454
, Ord name
5555
)
56-
=> (Term Core.Core name -> m a)
57-
-> (Term Core.Core name -> m a)
56+
=> (Term (Core.Ann :+: Core.Core) name -> m a)
57+
-> (Term (Core.Ann :+: Core.Core) name -> m a)
5858
cacheTerm eval term = do
5959
cached <- gets (Map.lookup term)
6060
case cached :: Maybe (Set.Set a) of

semantic-core/src/Analysis/ImportGraph.hs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
{-# LANGUAGE FlexibleContexts, OverloadedStrings, RecordWildCards #-}
1+
{-# LANGUAGE FlexibleContexts, OverloadedStrings, RecordWildCards, TypeOperators #-}
22
module Analysis.ImportGraph
33
( ImportGraph
44
, importGraph
@@ -41,14 +41,14 @@ instance Monoid Value where
4141
mempty = Value Abstract mempty
4242

4343
data Semi
44-
= Closure Loc User (Term Core.Core User) User
44+
= Closure Loc User (Term (Core.Ann :+: Core.Core) User) User
4545
-- FIXME: Bound String values.
4646
| String Text
4747
| Abstract
4848
deriving (Eq, Ord, Show)
4949

5050

51-
importGraph :: [File (Term Core.Core User)] -> (Heap User Value, [File (Either (Loc, String) Value)])
51+
importGraph :: [File (Term (Core.Ann :+: Core.Core) User)] -> (Heap User Value, [File (Either (Loc, String) Value)])
5252
importGraph
5353
= run
5454
. runFresh
@@ -61,7 +61,7 @@ runFile :: ( Carrier sig m
6161
, Member (Reader (FrameId User)) sig
6262
, Member (State (Heap User Value)) sig
6363
)
64-
=> File (Term Core.Core User)
64+
=> File (Term (Core.Ann :+: Core.Core) User)
6565
-> m (File (Either (Loc, String) Value))
6666
runFile file = traverse run file
6767
where run = runReader (fileLoc file)

semantic-core/src/Analysis/Typecheck.hs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ generalize :: Term Monotype Meta -> Term (Polytype :+: Monotype) Void
8686
generalize ty = fromJust (closed (forAlls (IntSet.toList (mvs ty)) (hoistTerm R ty)))
8787

8888

89-
typecheckingFlowInsensitive :: [File (Term Core.Core User)] -> (Heap User (Term Monotype Meta), [File (Either (Loc, String) (Term (Polytype :+: Monotype) Void))])
89+
typecheckingFlowInsensitive :: [File (Term (Core.Ann :+: Core.Core) User)] -> (Heap User (Term Monotype Meta), [File (Either (Loc, String) (Term (Polytype :+: Monotype) Void))])
9090
typecheckingFlowInsensitive
9191
= run
9292
. runFresh
@@ -99,7 +99,7 @@ runFile :: ( Carrier sig m
9999
, Member Fresh sig
100100
, Member (State (Heap User (Term Monotype Meta))) sig
101101
)
102-
=> File (Term Core.Core User)
102+
=> File (Term (Core.Ann :+: Core.Core) User)
103103
-> m (File (Either (Loc, String) (Term Monotype Meta)))
104104
runFile file = traverse run file
105105
where run

semantic-core/src/Data/Core.hs

Lines changed: 23 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ module Data.Core
2727
, record
2828
, (...)
2929
, (.=)
30+
, Ann(..)
3031
, ann
3132
, annWith
3233
, instantiate
@@ -75,7 +76,6 @@ data Core f a
7576
| f a :. User
7677
-- | Assignment of a value to the reference returned by the lhs.
7778
| f a := f a
78-
| Ann Loc (f a)
7979
deriving (Foldable, Functor, Generic1, Traversable)
8080

8181
infixr 1 :>>
@@ -105,7 +105,6 @@ instance RightModule Core where
105105
Record fs >>=* f = Record (map (fmap (>>= f)) fs)
106106
(a :. b) >>=* f = (a >>= f) :. b
107107
(a := b) >>=* f = (a >>= f) := (b >>= f)
108-
Ann l b >>=* f = Ann l (b >>= f)
109108

110109

111110
rec :: (Eq a, Carrier sig m, Member Core sig) => Named a -> m a -> m a
@@ -212,15 +211,30 @@ a .= b = send (a := b)
212211

213212
infix 3 .=
214213

215-
ann :: (Carrier sig m, Member Core sig) => HasCallStack => m a -> m a
214+
215+
data Ann f a
216+
= Ann Loc (f a)
217+
deriving (Foldable, Functor, Generic1, Traversable)
218+
219+
instance HFunctor Ann
220+
221+
deriving instance (Eq a, forall a . Eq a => Eq (f a), Monad f) => Eq (Ann f a)
222+
deriving instance (Ord a, forall a . Eq a => Eq (f a)
223+
, forall a . Ord a => Ord (f a), Monad f) => Ord (Ann f a)
224+
deriving instance (Show a, forall a . Show a => Show (f a)) => Show (Ann f a)
225+
226+
instance RightModule Ann where
227+
Ann l b >>=* f = Ann l (b >>= f)
228+
229+
230+
ann :: (Carrier sig m, Member Ann sig) => HasCallStack => m a -> m a
216231
ann = annWith callStack
217232

218-
annWith :: (Carrier sig m, Member Core sig) => CallStack -> m a -> m a
233+
annWith :: (Carrier sig m, Member Ann sig) => CallStack -> m a -> m a
219234
annWith callStack = maybe id (fmap send . Ann) (stackLoc callStack)
220235

221236

222-
stripAnnotations :: (Member Core sig, HFunctor sig, forall g . Functor g => Functor (sig g)) => Term sig a -> Term sig a
223-
stripAnnotations (Var v) = Var v
224-
stripAnnotations (Term t)
225-
| Just c <- prj t, Ann _ b <- c = stripAnnotations b
226-
| otherwise = Term (hmap stripAnnotations t)
237+
stripAnnotations :: (HFunctor sig, forall g . Functor g => Functor (sig g)) => Term (Ann :+: sig) a -> Term sig a
238+
stripAnnotations (Var v) = Var v
239+
stripAnnotations (Term (L (Ann _ b))) = stripAnnotations b
240+
stripAnnotations (Term (R b)) = Term (hmap stripAnnotations b)

semantic-core/src/Data/Core/Pretty.hs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -79,8 +79,6 @@ prettyCore style = precBody . go . fmap name
7979
, symbol "=" <+> align (withPrec 4 (go rhs))
8080
]
8181

82-
-- Annotations are not pretty-printed, as it lowers the signal/noise ratio too profoundly.
83-
Ann _ c -> go c
8482
statement ->
8583
let (bindings, return) = unstatements (Term statement)
8684
statements = toList (bindings :> (Nothing :<- return))

0 commit comments

Comments
 (0)