diff --git a/Eval.hs b/Eval.hs index 2c9a927055ba5b42faa7606ba83d49a0cdebdc66..a081f997b22b268a621178fcc8651fa5dae7a597 100644 --- a/Eval.hs +++ b/Eval.hs @@ -22,16 +22,16 @@ eval env expr = let (eval', evalFull') = (eval env, evalFull env) in case expr o _ -> error "Filter argument error" - Map -> case(inputSets', args') of - ([Set records], [lambda]) -> Set (map (\record -> eval' $ FuncCall lambda [] [record]) records) + Map -> eval' $ case(inputSets', args') of + ([Set records], [lambda]) -> Set (map (\record -> FuncCall lambda [] [record]) records) _ -> error "Map argument error" IsEqual -> case args' of -- TODO not sufficent. [e1, e2] -> Boolean (e1 == e2) _ -> error "isEqual argument error" - XProduct -> case inputSets' of - [(Set l1), (Set l2)] -> Set $ [ x `concatRecord` y | x <- l1, y <- l2] + XProduct -> eval' $ case inputSets' of + [Set l1, Set l2] -> Set $ [ x `concatRecord` y | x <- l1, y <- l2] _ -> error "X product takes in two sets" (BooleanFunc op) -> case args' of @@ -40,7 +40,6 @@ eval env expr = let (eval', evalFull') = (eval env, evalFull env) in case expr o RecordIndex -> eval' $ case args' of [Record recordData,Int index] -> recordData `listAtIndex` index ---TODO CBH RecordSelect -> case args' of (Record recordData: indexes ) -> Record filteredList where @@ -74,13 +73,10 @@ eval env expr = let (eval', evalFull') = (eval env, evalFull env) in case expr o Not -> case args' of [Boolean exp1] -> Boolean $ not exp1 - --implement later - --(Map) -> Set $ (map (\r -> FuncCall predicate [] [r]) inputRecords) (FuncDef setParams argParams body) -> eval newEnv body where newEnv = let (setEnv, argsEnv) = (zip setParams inputSets, zip argParams args) in setEnv ++ argsEnv ++ env - --newEnv = foldl (\env entry@(name, expr) -> addVar env name expr) env --adds entries to environment - -- TODO FIX + (Var name) -> case findVar env name of (Just value) -> eval' value Nothing -> error $ "Variable " ++ name ++ " not found." @@ -97,7 +93,7 @@ eval env expr = let (eval', evalFull') = (eval env, evalFull env) in case expr o eval newEnv newControl (Record exprs) -> Record $ map eval' exprs - (Record exprs) -> Record $ map eval' exprs + (Set exprs) -> Set $ map eval' exprs _ -> expr listAtIndex :: [a] -> Int -> a