@@ -19,20 +19,22 @@ import Data.Binary hiding (get, put)
1919import Core.TT
2020import Core.CaseTree
2121
22−data EvalState = ES { limited :: [(Name, Int)] }
22+data EvalState = ES { limited :: [(Name, Int)],
23+ nexthole :: Int }
2324
2425type Eval a = State EvalState a
2526
2627data EvalOpt = Spec | HNF | Simplify Bool | AtREPL
2728 deriving (Show, Eq)
2829
29−initEval = ES []
30+initEval = ES [] 0
3031
3132-- VALUES (as HOAS) ---------------------------------------------------------
3233-- | A HOAS representation of values
3334data Value = VP NameType Name Value
3435 | VV Int
3536 | VBind Name (Binder Value) (Value -> Eval Value)
37+ | VBLet Int Name Value Value Value
3638 | VApp Value Value
3739 | VType UExp
3840 | VErased
@@ -166,20 +168,24 @@ eval traceon ctxt ntimes genv tm opts = ev ntimes [] True [] tm where
166168 (Just v, _) -> return v
167169 _ -> liftM (VP Ref n) (ev ntimes stk top env ty)
168170 ev ntimes stk top env (P nt n ty) = liftM (VP nt n) (ev ntimes stk top env ty)
169− ev ntimes stk top env (V i) | i < length env = return $ env !! i
171+ ev ntimes stk top env (V i)
172+ | i < length env && i >= 0 = return $ env !! i
170173 | otherwise = return $ VV i
171174 ev ntimes stk top env (Bind n (Let t v) sc)
172−-- | not simpl || vinstances 0 sc < 2
175+ | not simpl -- || vinstances 0 sc < 2
173176 = do v' <- ev ntimes stk top env v --(finalise v)
174177 sc' <- ev ntimes stk top (v' : env) sc
175178 wknV (-1) sc'
176−{- | otherwise -- put this back when the Bind works properly
179+ | otherwise -- put this back when the Bind works properly
177180 = do t' <- ev ntimes stk top env t
178181 v' <- ev ntimes stk top env v --(finalise v)
179182 -- use Tmp as a placeholder, then make it a variable reference
180183 -- again when evaluation finished
181− sc' <- ev ntimes stk top (v' : env) sc
182− return $ VBind n (Let t' v') (\x -> return sc') -}
184+ hs <- get
185+ let vd = nexthole hs
186+ put (hs { nexthole = vd + 1 })
187+ sc' <- ev ntimes stk top (VP Bound (MN vd "vlet") VErased : env) sc
188+ return $ VBLet vd n t' v' sc'
183189 ev ntimes stk top env (Bind n (NLet t v) sc)
184190 = do t' <- ev ntimes stk top env (finalise t)
185191 v' <- ev ntimes stk top env (finalise v)
@@ -331,15 +337,14 @@ eval traceon ctxt ntimes genv tm opts = ev ntimes [] True [] tm where
331337 getValArgs' (VApp f a) as = getValArgs' f (a:as)
332338 getValArgs' f as = (f, as)
333339
334−tmpToV i (VTmp 0) = return $ VV i
335−tmpToV i (VP nt n v) = liftM (VP nt n) (tmpToV i v)
336−
337−tmpToV i (VBind n b sc) = do b' <- fmapMB (tmpToV i) b
338− let sc' = \x -> do x' <- sc x
339− tmpToV (i + 1) x'
340− return (VBind n b' sc')
341−tmpToV i (VApp f a) = liftM2 VApp (tmpToV i f) (tmpToV i a)
342−tmpToV i x = return x
340+-- tmpToV i vd (VLetHole j) | vd == j = return $ VV i
341+-- tmpToV i vd (VP nt n v) = liftM (VP nt n) (tmpToV i vd v)
342+-- tmpToV i vd (VBind n b sc) = do b' <- fmapMB (tmpToV i vd) b
343+-- let sc' = \x -> do x' <- sc x
344+-- tmpToV (i + 1) vd x'
345+-- return (VBind n b' sc')
346+-- tmpToV i vd (VApp f a) = liftM2 VApp (tmpToV i vd f) (tmpToV i vd a)
347+-- tmpToV i vd x = return x
343348
344349class Quote a where
345350 quote :: Int -> a -> Eval (TT Name)
@@ -351,6 +356,12 @@ instance Quote Value where
351356 b' <- quoteB b
352357 liftM (Bind n b') (quote (i+1) sc')
353358 where quoteB t = fmapMB (quote i) t
359+ quote i (VBLet vd n t v sc)
360+ = do sc' <- quote i sc
361+ t' <- quote i t
362+ v' <- quote i v
363+ let sc'' = pToV (MN vd "vlet") (addBinder sc')
364+ return (Bind n (Let t' v') sc'')
354365 quote i (VApp f a) = liftM2 App (quote i f) (quote i a)
355366 quote i (VType u) = return $ TType u
356367 quote i VErased = return $ Erased