Changeset 4376 for src/Pugs/Prim/Eval.hs

Show
Ignore:
Timestamp:
06/04/05 16:13:31 (4 years ago)
Author:
gaal
svk:copy_cache_prev:
5943
Message:

opEval refactoring, introduce EvalStyle? type
TODO: allow some evals (eg., require/use) to raise exceptions on errors

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • src/Pugs/Prim/Eval.hs

    r4198 r4376  
    44    opEval, opEvalfile, 
    55    opRequire, 
     6    EvalError(..), EvalResult(..), EvalStyle(..), 
    67    -- used by Pugs.Eval -- needs factored somewhere bettwen 
    78    retEvalResult,  
     
    1213import Pugs.Internals 
    1314 
     15data EvalError = EvalErrorFatal 
     16               | EvalErrorUndef 
     17               deriving Eq 
     18data EvalResult = EvalResultLastValue 
     19                | EvalResultModule 
     20                | EvalResultEnv 
     21                deriving Eq 
     22data EvalStyle = MkEvalStyle 
     23               { evalError  :: EvalError 
     24               , evalResult :: EvalResult 
     25               } 
     26 
    1427opRequire :: Bool -> Val -> Eval Val 
    1528opRequire dumpEnv v = do 
     
    1831    requireInc incs file (errMsg file incs) 
    1932    where 
     33    style = MkEvalStyle{ evalError  = EvalErrorFatal 
     34                       , evalResult = (if dumpEnv == True then EvalResultEnv else EvalResultLastValue)} 
    2035    errMsg file incs = "Can't locate " ++ file ++ " in @INC (@INC contains: " ++ unwords incs ++ ")." 
    2136    requireInc [] _ msg = fail msg 
     
    2742            else do 
    2843                str <- liftIO $ readFile pathName 
    29                 opEval (Just dumpEnv) pathName (decodeUTF8 str) 
     44                opEval style pathName (decodeUTF8 str) 
    3045 
    3146opEvalfile :: String -> Eval Val 
     
    3651        else do 
    3752            contents <- liftIO $ readFile filename 
    38             opEval Nothing filename $ decodeUTF8 contents 
     53            opEval MkEvalStyle{ evalError=EvalErrorUndef, evalResult=EvalResultLastValue} filename $ decodeUTF8 contents 
    3954 
    4055op1EvalHaskell :: Val -> Eval Val 
     
    4257    str     <- fromVal cv 
    4358    val     <- resetT $ evalHaskell str 
    44     retEvalResult False val 
     59    retEvalResult MkEvalStyle{ evalError=EvalErrorUndef, evalResult=EvalResultLastValue} val 
    4560 
    46 opEval :: Maybe Bool -> String -> String -> Eval Val 
    47 opEval flag name str = do 
     61opEval :: EvalStyle -> FilePath -> String -> Eval Val 
     62opEval style path str = do 
    4863    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 
    5268    val <- resetT $ local (const env') $ do 
    5369        evl <- asks envEval 
    5470        evl (trans $ envBody env') 
    55     retEvalResult (maybe False id flag) val 
     71    retEvalResult style val 
    5672 
    57 retEvalResult :: Bool -> Val -> Eval Val 
    58 retEvalResult external val = do 
     73retEvalResult :: EvalStyle -> Val -> Eval Val 
     74retEvalResult style val = do 
    5975    glob <- askGlobal 
    6076    errSV <- findSymRef "$!" glob 
    6177    case val of 
    62         VError str _ | not external  -> do 
     78        VError str _ -> do 
    6379            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 
    6484            retEmpty 
    6585        _ -> do