1- {-# LANGUAGE FlexibleContexts, LambdaCase, OverloadedStrings, RankNTypes, RecordWildCards #-}
1+ {-# LANGUAGE FlexibleContexts, LambdaCase, OverloadedStrings, RankNTypes, RecordWildCards, TypeOperators #-}
22module Analysis.Eval
33( eval
44, prog1
@@ -12,6 +12,7 @@ module Analysis.Eval
1212) where
1313
1414import Control.Applicative (Alternative (.. ))
15+ import Control.Effect.Carrier
1516import Control.Effect.Fail
1617import Control.Effect.Reader
1718import 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 )
3839eval 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 )
9394prog1 = 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 )
100101prog2 = fromBody $ fileBody prog1 $$ Core. bool True
101102
102- prog3 :: File (Term Core User )
103+ prog3 :: File (Term ( Ann :+: Core ) User )
103104prog3 = 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 )
109110prog4 = 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 )
116117prog5 = 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 )]
127128prog6 =
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 )
137138ruby = 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
0 commit comments