Advertisement
Guest User

Untitled

a guest
Oct 10th, 2015
188
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. type Function = (String, [String], Expression)
  2. type Functions = [Function]
  3.  
  4. data Interpreter = Interpreter
  5. data Operator = Plus | Minus | Times | Div | Mod
  6. data Expression = Constant Double |
  7.                   Variable String |
  8.                   Operation Expression Operator Expression |
  9.                   Assignment String Expression |
  10.                   Funcall String [Expression]
  11.  
  12. evalExpression :: Expression -> Variables -> Functions -> Result
  13. evalExpression (Constant d) _ _ = Just d
  14. evalExpression (Variable s) vars _ = snd <$> find ((==s) . fst) vars
  15. evalExpression (Assignment _ expr) vars funs = evalExpression expr vars funs
  16. evalExpression (Operation lhs Plus rhs) vars funs = (+) <$> evalExpression lhs vars funs <*> evalExpression rhs vars funs
  17. evalExpression (Operation lhs Minus rhs) vars funs = (-) <$> evalExpression lhs vars funs <*> evalExpression rhs vars funs
  18. evalExpression (Operation lhs Times rhs) vars funs = (*) <$> evalExpression lhs vars funs <*> evalExpression rhs vars funs
  19. evalExpression (Operation lhs Div rhs) vars funs = (/) <$> evalExpression lhs vars funs <*> evalExpression rhs vars funs
  20.  
  21. evalExpression (Operation lhs Mod rhs) vars funs = fmap fromIntegral $ mod <$> intLhs <*> intRhs
  22.   where intLhs = fmap floor (evalExpression lhs vars funs)
  23.         intRhs = fmap floor (evalExpression rhs vars funs)
  24.  
  25. evalExpression (Funcall funName paramExprs) vars funs = funcResult
  26.   where evaluatedParams = map (\expr -> evalExpression expr vars funs) paramExprs
  27.         matchingFunction = find ((==funName) . (^._1)) funs
  28.         okToCall (Just (_, fparams, _)) = length fparams == length paramExprs && notElem Nothing evaluatedParams
  29.         okToCall (Nothing) = False
  30.         funcResult = if okToCall matchingFunction
  31.                      then evalExpression (fromJust matchingFunction^._3) (zip (fromJust matchingFunction^._2) (map fromJust evaluatedParams)) funs
  32.                      else Nothing
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement