Advertisement
NickMarcha

Untitled

Apr 12th, 2022
1,027
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. exec (CallProc pName args) execModel@(funModel, program) state =
  2.   let
  3.  
  4.     calledProcedure :: ProcedureDeclaration
  5.     calledProcedure = getProc pName program
  6.  
  7.     -- | Params matched with Expresions
  8.     paredParamsAndArgs :: [(Parameter, Expr)]
  9.     paredParamsAndArgs = zip (procParams calledProcedure) args
  10.  
  11.     -- | Params matched with Expresions, filtered out "Out" modes
  12.     filteredOutParamsExpr :: [(Parameter, Expr)]
  13.     filteredOutParamsExpr =
  14.        (filter (\pa -> not $ isOutMode pa) paredParamsAndArgs)
  15.        where
  16.         isOutMode :: (Parameter, Expr) -> Bool
  17.         isOutMode ((mode,_ ), _) = mode == Out
  18.  
  19.     -- | Params matched with Expresions, filtered out "Obs" modes
  20.     filteredObsParamsExpr :: [(Parameter, Expr)]
  21.     filteredObsParamsExpr =
  22.        (filter (\pa -> not $ isObsMode pa) paredParamsAndArgs)
  23.        where
  24.         isObsMode :: (Parameter, Expr) -> Bool
  25.         isObsMode ((mode,_ ), _) = mode == Obs
  26.  
  27.     preparedValues :: [Value]
  28.     preparedValues = map (\expr -> eval (snd expr) funModel state) filteredOutParamsExpr
  29.  
  30.     preparedState :: State
  31.     preparedState = addCallStateInputs (procParams calledProcedure) preparedValues $ S.clearEnvironment state
  32.  
  33.     performedState :: State
  34.     performedState = performP calledProcedure execModel preparedState
  35.  
  36.     performP :: ProcedureDeclaration -> ExecutionModel -> State -> State
  37.     performP (Proc _ params locals body) prog state =
  38.       let
  39.         oldStackFrame = S.getStackFrame state
  40.         stateWithLocals = addUninitVars (map varName locals) state
  41.         stateAfterExec = exec body prog stateWithLocals
  42.         stateAfterCleanup = S.setStackFrame oldStackFrame stateAfterExec
  43.         stateAfterAdd = addResults
  44.         addResults ::  State
  45.         addResults =
  46.           let
  47.             outputVars :: [Var]
  48.             outputVars = getParamNames $ filter isOutputParameter $ params
  49.             isOutputParameter (mode, _) = mode /= Obs
  50.             getParamNames :: [Parameter] -> [Var]
  51.             getParamNames = map (varName . paramVar)
  52.             values :: [Value]
  53.             values = map (\varName -> S.getValue varName stateAfterExec) outputVars
  54.             varExpWithValue :: [(Expr, Value)]
  55.             varExpWithValue = zip (map snd filteredObsParamsExpr) values
  56.  
  57.             addResult :: State -> ( Expr, Value) -> State
  58.             addResult st ((VarExp ve), v) = S.addVariable ve v st
  59.           in foldl addResult stateAfterCleanup varExpWithValue
  60.       in stateAfterAdd
  61.   in performedState
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement