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

Commit 5521d7d

Browse files
author
Patrick Thomson
authored
Merge pull request #208 from github/factor-annotations-out-of-core
Factor annotations out of Core
2 parents 735340b + 514703d commit 5521d7d

File tree

11 files changed

+90
-79
lines changed

11 files changed

+90
-79
lines changed

semantic-core/semantic-core.cabal

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,7 @@ test-suite spec
8484
other-modules: Generators
8585
build-depends: base
8686
, semantic-core
87+
, fused-effects
8788
, hedgehog ^>= 1
8889
, tasty >= 1.2 && <2
8990
, tasty-hedgehog ^>= 1.0.0.1

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
@@ -70,7 +70,7 @@ data Edge = Lexical | Import
7070
--
7171
-- >>> map fileBody (snd (concrete [File (Loc "bool" emptySpan) (Core.bool True)]))
7272
-- [Right (Bool True)]
73-
concrete :: [File (Term Core.Core User)] -> (Heap, [File (Either (Loc, String) Concrete)])
73+
concrete :: [File (Term (Core.Ann :+: Core.Core) User)] -> (Heap, [File (Either (Loc, String) Concrete)])
7474
concrete
7575
= run
7676
. runFresh
@@ -82,7 +82,7 @@ runFile :: ( Carrier sig m
8282
, Member Fresh sig
8383
, Member (State Heap) sig
8484
)
85-
=> File (Term Core.Core User)
85+
=> File (Term (Core.Ann :+: Core.Core) User)
8686
-> m (File (Either (Loc, String) Concrete))
8787
runFile file = traverse run file
8888
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))
@@ -71,7 +72,7 @@ eval Analysis{..} eval = \case
7172
b' <- eval b
7273
addr <- ref a
7374
b' <$ assign addr b'
74-
Ann loc c -> local (const loc) (eval c)
75+
Term (L (Ann loc c)) -> local (const loc) (eval c)
7576
where freeVariable s = fail ("free variable: " <> s)
7677
uninitialized s = fail ("uninitialized variable: " <> s)
7778
invalidRef s = fail ("invalid ref: " <> s)
@@ -81,41 +82,41 @@ eval Analysis{..} eval = \case
8182

8283
ref = \case
8384
Var n -> lookupEnv' n
84-
Term c -> case c of
85+
Term (R c) -> case c of
8586
If c t e -> do
8687
c' <- eval c >>= asBool
8788
if c' then ref t else ref e
8889
a :. b -> do
8990
a' <- ref a
9091
a' ... b >>= maybe (freeVariable (show b)) pure
91-
Ann loc c -> local (const loc) (ref c)
9292
c -> invalidRef (show c)
93+
Term (L (Ann loc c)) -> local (const loc) (ref c)
9394

9495

95-
prog1 :: File (Term Core User)
96+
prog1 :: (Carrier sig t, Member Core sig) => File (t User)
9697
prog1 = fromBody $ lam (named' "foo")
9798
( named' "bar" :<- pure "foo"
9899
>>>= Core.if' (pure "bar")
99100
(Core.bool False)
100101
(Core.bool True))
101102

102-
prog2 :: File (Term Core User)
103+
prog2 :: (Carrier sig t, Member Core sig) => File (t User)
103104
prog2 = fromBody $ fileBody prog1 $$ Core.bool True
104105

105-
prog3 :: File (Term Core User)
106+
prog3 :: (Carrier sig t, Member Core sig) => File (t User)
106107
prog3 = fromBody $ lams [named' "foo", named' "bar", named' "quux"]
107108
(Core.if' (pure "quux")
108109
(pure "bar")
109110
(pure "foo"))
110111

111-
prog4 :: File (Term Core User)
112+
prog4 :: (Carrier sig t, Member Core sig) => File (t User)
112113
prog4 = fromBody
113114
( named' "foo" :<- Core.bool True
114115
>>>= Core.if' (pure "foo")
115116
(Core.bool True)
116117
(Core.bool False))
117118

118-
prog5 :: File (Term Core User)
119+
prog5 :: (Carrier sig t, Member Ann sig, Member Core sig) => File (t User)
119120
prog5 = fromBody $ ann (do'
120121
[ Just (named' "mkPoint") :<- lams [named' "_x", named' "_y"] (ann (Core.record
121122
[ ("x", ann (pure "_x"))
@@ -126,7 +127,7 @@ prog5 = fromBody $ ann (do'
126127
, Nothing :<- ann (ann (pure "point") Core.... "y") .= ann (ann (pure "point") Core.... "x")
127128
])
128129

129-
prog6 :: [File (Term Core User)]
130+
prog6 :: (Carrier sig t, Member Core sig) => [File (t User)]
130131
prog6 =
131132
[ File (Loc "dep" (locSpan (fromJust here))) $ Core.record
132133
[ ("dep", Core.record [ ("var", Core.bool True) ]) ]
@@ -136,7 +137,7 @@ prog6 =
136137
])
137138
]
138139

139-
ruby :: File (Term Core User)
140+
ruby :: (Carrier sig t, Member Ann sig, Member Core sig) => File (t User)
140141
ruby = fromBody $ annWith callStack (rec (named' __semantic_global) (do' statements))
141142
where statements =
142143
[ Just "Class" :<- record
@@ -219,8 +220,8 @@ data Analysis address value m = Analysis
219220
, lookupEnv :: User -> m (Maybe address)
220221
, deref :: address -> m (Maybe value)
221222
, assign :: address -> value -> m ()
222-
, abstract :: (Term Core User -> m value) -> User -> Term Core User -> m value
223-
, apply :: (Term Core User -> m value) -> value -> value -> m value
223+
, abstract :: (Term (Ann :+: Core) User -> m value) -> User -> Term (Ann :+: Core) User -> m value
224+
, apply :: (Term (Ann :+: Core) User -> m value) -> value -> value -> m value
224225
, unit :: m value
225226
, bool :: Bool -> m value
226227
, 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
@@ -88,7 +88,7 @@ generalize :: Term Monotype Meta -> Term (Polytype :+: Monotype) Void
8888
generalize ty = fromJust (closed (forAlls (IntSet.toList (mvs ty)) (hoistTerm R ty)))
8989

9090

91-
typecheckingFlowInsensitive :: [File (Term Core.Core User)] -> (Heap User (Term Monotype Meta), [File (Either (Loc, String) (Term (Polytype :+: Monotype) Void))])
91+
typecheckingFlowInsensitive :: [File (Term (Core.Ann :+: Core.Core) User)] -> (Heap User (Term Monotype Meta), [File (Either (Loc, String) (Term (Polytype :+: Monotype) Void))])
9292
typecheckingFlowInsensitive
9393
= run
9494
. runFresh
@@ -101,7 +101,7 @@ runFile :: ( Carrier sig m
101101
, Member Fresh sig
102102
, Member (State (Heap User (Term Monotype Meta))) sig
103103
)
104-
=> File (Term Core.Core User)
104+
=> File (Term (Core.Ann :+: Core.Core) User)
105105
-> m (File (Either (Loc, String) (Term Monotype Meta)))
106106
runFile file = traverse run file
107107
where run

semantic-core/src/Data/Core.hs

Lines changed: 18 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,25 @@ 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 (Eq, Foldable, Functor, Generic1, Ord, Show, Traversable)
218+
219+
instance HFunctor Ann
220+
221+
instance RightModule Ann where
222+
Ann l b >>=* f = Ann l (b >>= f)
223+
224+
225+
ann :: (Carrier sig m, Member Ann sig) => HasCallStack => m a -> m a
216226
ann = annWith callStack
217227

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

221231

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)
232+
stripAnnotations :: (HFunctor sig, forall g . Functor g => Functor (sig g)) => Term (Ann :+: sig) a -> Term sig a
233+
stripAnnotations (Var v) = Var v
234+
stripAnnotations (Term (L (Ann _ b))) = stripAnnotations b
235+
stripAnnotations (Term (R b)) = Term (hmap stripAnnotations b)

0 commit comments

Comments
 (0)