Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- type Function = (String, [String], Expression)
- type Functions = [Function]
- data Interpreter = Interpreter
- data Operator = Plus | Minus | Times | Div | Mod
- data Expression = Constant Double |
- Variable String |
- Operation Expression Operator Expression |
- Assignment String Expression |
- Funcall String [Expression]
- evalExpression :: Expression -> Variables -> Functions -> Result
- evalExpression (Constant d) _ _ = Just d
- evalExpression (Variable s) vars _ = snd <$> find ((==s) . fst) vars
- evalExpression (Assignment _ expr) vars funs = evalExpression expr vars funs
- evalExpression (Operation lhs Plus rhs) vars funs = (+) <$> evalExpression lhs vars funs <*> evalExpression rhs vars funs
- evalExpression (Operation lhs Minus rhs) vars funs = (-) <$> evalExpression lhs vars funs <*> evalExpression rhs vars funs
- evalExpression (Operation lhs Times rhs) vars funs = (*) <$> evalExpression lhs vars funs <*> evalExpression rhs vars funs
- evalExpression (Operation lhs Div rhs) vars funs = (/) <$> evalExpression lhs vars funs <*> evalExpression rhs vars funs
- evalExpression (Operation lhs Mod rhs) vars funs = fmap fromIntegral $ mod <$> intLhs <*> intRhs
- where intLhs = fmap floor (evalExpression lhs vars funs)
- intRhs = fmap floor (evalExpression rhs vars funs)
- evalExpression (Funcall funName paramExprs) vars funs = funcResult
- where evaluatedParams = map (\expr -> evalExpression expr vars funs) paramExprs
- matchingFunction = find ((==funName) . (^._1)) funs
- okToCall (Just (_, fparams, _)) = length fparams == length paramExprs && notElem Nothing evaluatedParams
- okToCall (Nothing) = False
- funcResult = if okToCall matchingFunction
- then evalExpression (fromJust matchingFunction^._3) (zip (fromJust matchingFunction^._2) (map fromJust evaluatedParams)) funs
- else Nothing
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement