Changeset 4376 for src/Pugs/Prim/Eval.hs
- Timestamp:
- 06/04/05 16:13:31 (4 years ago)
- svk:copy_cache_prev:
- 5943
- Files:
-
- 1 modified
-
src/Pugs/Prim/Eval.hs (modified) (6 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/Pugs/Prim/Eval.hs
r4198 r4376 4 4 opEval, opEvalfile, 5 5 opRequire, 6 EvalError(..), EvalResult(..), EvalStyle(..), 6 7 -- used by Pugs.Eval -- needs factored somewhere bettwen 7 8 retEvalResult, … … 12 13 import Pugs.Internals 13 14 15 data EvalError = EvalErrorFatal 16 | EvalErrorUndef 17 deriving Eq 18 data EvalResult = EvalResultLastValue 19 | EvalResultModule 20 | EvalResultEnv 21 deriving Eq 22 data EvalStyle = MkEvalStyle 23 { evalError :: EvalError 24 , evalResult :: EvalResult 25 } 26 14 27 opRequire :: Bool -> Val -> Eval Val 15 28 opRequire dumpEnv v = do … … 18 31 requireInc incs file (errMsg file incs) 19 32 where 33 style = MkEvalStyle{ evalError = EvalErrorFatal 34 , evalResult = (if dumpEnv == True then EvalResultEnv else EvalResultLastValue)} 20 35 errMsg file incs = "Can't locate " ++ file ++ " in @INC (@INC contains: " ++ unwords incs ++ ")." 21 36 requireInc [] _ msg = fail msg … … 27 42 else do 28 43 str <- liftIO $ readFile pathName 29 opEval (Just dumpEnv)pathName (decodeUTF8 str)44 opEval style pathName (decodeUTF8 str) 30 45 31 46 opEvalfile :: String -> Eval Val … … 36 51 else do 37 52 contents <- liftIO $ readFile filename 38 opEval Nothingfilename $ decodeUTF8 contents53 opEval MkEvalStyle{ evalError=EvalErrorUndef, evalResult=EvalResultLastValue} filename $ decodeUTF8 contents 39 54 40 55 op1EvalHaskell :: Val -> Eval Val … … 42 57 str <- fromVal cv 43 58 val <- resetT $ evalHaskell str 44 retEvalResult Falseval59 retEvalResult MkEvalStyle{ evalError=EvalErrorUndef, evalResult=EvalResultLastValue} val 45 60 46 opEval :: Maybe Bool -> String-> String -> Eval Val47 opEval flag namestr = do61 opEval :: EvalStyle -> FilePath -> String -> Eval Val 62 opEval style path str = do 48 63 env <- ask 49 let env' = parseProgram env name str 50 trans | flag == Just True = (`mergeStmts` Syn "env" []) 51 | otherwise = id 64 let env' = parseProgram env path str 65 trans = case evalResult style of 66 EvalResultEnv -> (`mergeStmts` Syn "env" []) 67 _ -> id 52 68 val <- resetT $ local (const env') $ do 53 69 evl <- asks envEval 54 70 evl (trans $ envBody env') 55 retEvalResult (maybe False id flag)val71 retEvalResult style val 56 72 57 retEvalResult :: Bool-> Val -> Eval Val58 retEvalResult externalval = do73 retEvalResult :: EvalStyle -> Val -> Eval Val 74 retEvalResult style val = do 59 75 glob <- askGlobal 60 76 errSV <- findSymRef "$!" glob 61 77 case val of 62 VError str _ | not external-> do78 VError str _ -> do 63 79 writeRef errSV (VStr str) 80 when (evalError style == EvalErrorFatal) $ do 81 --trace ("fatal error" ++ str) $ return () 82 --FIXME: this should be made to throw an exception. 83 fail str 64 84 retEmpty 65 85 _ -> do
