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))
@@ -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 )
9697prog1 = 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 )
103104prog2 = fromBody $ fileBody prog1 $$ Core. bool True
104105
105- prog3 :: File ( Term Core User )
106+ prog3 :: ( Carrier sig t , Member Core sig ) => File ( t User )
106107prog3 = 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 )
112113prog4 = 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 )
119120prog5 = 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 )]
130131prog6 =
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 )
140141ruby = 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
0 commit comments